home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack10d.sfx / issue10d
Text File  |  1990-02-12  |  90KB  |  1,991 lines

  1. 2. ┬╒╞╞┼╥╙
  2.  
  3. ┬YTES RECEIVED ARE PLACED IN "CIRCULAR" OR "RING" BUFFERS BY THE SAMPLE
  4. ROUTINE BELOW, AND ALSO BY THE FIRST SAMPLE TRANSMIT ROUTINE.  ╘O KEEP THINGS
  5. SIMILAR TO THE ╦ERNAL ╥╙-232 IMPLEMENTATION, WE'VE SHOWN 256-BYTE BUFFERS.
  6. ┘OU MAY WANT TO USE LARGER BUFFERS FOR FILE TRANSFERS OR TO ALLOW MORE
  7. SCREEN-PROCESSING TIME.  ┬YPASSING THE ╦ERNAL ROUTINES FREE MANY ZERO-PAGE
  8. LOCATIONS, WHICH COULD IMPROVE PERFORMANCE OF POINTERS TO LARGE BUFFERS.
  9.  
  10. ╔F YOUR PROGRAM ALREADY DIRECTLY MANIPULATES THE ╦ERNAL ╥╙-232 BUFFERS, YOU'LL
  11. FIND IT VERY EASY TO ADAPT TO THE ┴├╔┴.  ╔F YOU USE CALLS TO THE ╦ERNAL ╥╙-232
  12. FILE ROUTINES INSTEAD, YOU'LL NEED TO IMPLEMENT LOWER-LEVEL CODE TO GET AND
  13. STORE BUFFER DATA.
  14.  
  15. ┬RIEFLY, EACH BUFFER HAS A "HEAD" AND "TAIL" POINTER.  ╘HE HEAD POINTS TO THE
  16. NEXT BYTE TO BE REMOVED FROM THE BUFFER.  ╘HE TAIL POINTS TO THE NEXT FREE
  17. LOCATION IN WHICH TO STORE A BYTE.  ╔F THE HEAD AND TAIL BOTH POINT TO THE
  18. SAME LOCATION, THE BUFFER IS EMPTY.  ╔F (TAIL+1)==HEAD, THE BUFFER IS FULL.
  19.  
  20. ╘HE INTERRUPT HANDLER DESCRIBED BELOW WILL PLACE RECEIVED BYTES AT THE TAIL OF
  21. THE RECEIVE BUFFER.  ┘OUR PROGRAM SHOULD MONITOR THE BUFFER, EITHER BY
  22. COMPARING THE HEAD AND TAIL POINTERS (AS THE ├OMMODORE ╦ERNAL ROUTINES DO), OR
  23. BY MAINTAINING A BYTE COUNT THROUGH THE INTERRUPT HANDLER (AS THE ATTACHED
  24. SAMPLE DOES).  ╫HEN BYTES ARE AVAILABLE, YOUR PROGRAM CAN PROCESS THEM, MOVE
  25. THE HEAD POINTER TO THE NEXT CHARACTER, AND DECREMENT THE COUNTER IF YOU USE
  26. ONE.
  27.  
  28. ┘OU SHOULD SEND A "├TRL-╙" (┴╙├╔╔ 19) TO THE HOST WHEN THE BUFFER IS NEARING
  29. CAPACITY.  ┴T HIGHER BAUD RATES, THIS "MAXIMUM SIZE" POINT MAY NEED TO BE
  30. LOWERED.  ╫E FOUND 50 TO 100 BYTES WORKED FAIRLY WELL AT 9600 BAUD.  ┘OU CAN
  31. PROBABLY DO THINGS MORE EFFICIENTLY (WE WERE USING A _VERY_ ROUGH
  32. IMPLEMENTATION) AND SET A HIGHER MAXIMUM SIZE.  ┴T SOME "MAXIMUM SIZE", A
  33. "├TRL-╤" (┴╙├╔╔ 17) CAN BE SENT TO THE HOST TO RESUME TRANSMISSION.
  34.  
  35. ╘O TRANSMIT A BYTE USING THE LOGIC OF THE FIRST TRANSMIT ROUTINE BELOW, FIRST
  36. MAKE SURE THAT THE TRANSMIT BUFFER ISN'T FULL.  ╘HEN STORE THE BYTE AT THE
  37. TAIL OF THE TRANSMIT BUFFER, POINT THE TAIL TO THE NEXT AVAILABLE LOCATION,
  38. AND INCREMENT THE TRANSMIT BUFFER COUNTER (IF USED).
  39.  
  40. ╘HE 6551 TRANSMIT INTERRUPT OCCURS WHEN THE TRANSMIT REGISTER IS EMPTY AND
  41. AVAILABLE FOR TRANSMITTING ANOTHER BYTE.  ╒NLESS THERE ARE BYTES TO TRANSMIT,
  42. THIS CREATES UNNECESSARY INTERRUPTS AND WASTES A LOT OF TIME.  ╙O, WHEN THE
  43. LAST BYTE IS REMOVED FROM THE BUFFER, THE INTERRUPT HANDLER IN THE FIRST
  44. TRANSMIT ROUTINE BELOW DISABLES TRANSMIT INTERRUPTS.
  45.  
  46. ┘OUR PROGRAM'S CODE THAT STUFFS NEW BYTES INTO THE TRANSMIT BUFFER MUST
  47. RE-ENABLE TRANSMIT INTERRUPTS, OR YOUR BYTES MAY NEVER BE SENT.  ┴ MODEL FOR A
  48. MAIN CODE ROUTINE FOR PLACING BYTES INTO THE TRANSMIT BUFFER FOLLOWS THE
  49. SAMPLE INTERRUPT HANDLER.
  50.  
  51. ╒SING A TRANSMIT BUFFER ALLOWS  YOUR MAIN PROGRAM TO PERFORM OTHER TAKES WHILE
  52. THE ╬═╔ INTERRUPT ROUTINE TAKES CARE OF SENDING BYTES TO THE ┴├╔┴.  ╔F THE
  53. BUFFER HAS MORE THAN A FEW CHARACTERS, HOWEVER, YOU MAY FIND THAT MOST OF THE
  54. PROCESSOR TIME IS SPENT SERVICING THE INTERRUPT.  ╙INCE THE ┴├╔┴ GENERATES ╬═╔
  55. INTERRUPTS, YOU CAN'T "MASK" THEM FROM THE PROCESSOR, AND YOU MAY HAVE TIMING
  56. DIFFICULTIES IN YOUR PROGRAM.
  57.  
  58. ╧NE SOLUTION IS TO ELIMINATE THE TRANSMIT BUFFER COMPLETELY.  ┘OUR PROGRAM CAN
  59. DECIDE WHEN TO SEND EACH BYTE AND PERFORM ANY OTHER NECESSARY TASKS IN BETWEEN
  60. BYTES AS NEEDED.  ┴ MODEL FOR THE MAIN-CODE ROUTINE FOR TRANSMITTING BYTES
  61. WITHOUT A TRANSMIT BUFFER IS ALSO SHOWN FOLLOWING THE SAMPLE INTERRUPT-HANDLER
  62. CODE.  ╞EEDBACK FROM DEVELOPERS TO DATE IS THAT MANY OF THEM HAVE BETTER LUCK
  63. _NOT_ USING TRANSMIT INTERRUPTS OR A TRANSMIT BUFFER.
  64.  
  65. ┴LTHOUGH IT'S POSSIBLE TO ELIMINATE THE RECEIVE BUFFER ALSO, WE STRONGLY
  66. ADVISE THAT YOU DON'T.  ╘HE HOST COMPUTER, NOT YOUR PROGRAM, DECIDES WHEN
  67. A NEW BYTE WILL ARRIVE.  ╨OLLING THE ┴├╔┴ FOR RECEIVED BYTES INSTEAD OF
  68. USING AN INTERRUPT-DRIVEN BUFFER JUST WASTE'S YOUR PROGRAM'S TIME AND
  69. RISKS MISSING DATA.
  70.  
  71. ╞OR A THOROUGH DISCUSSION OF THE USE OF BUFFERS, THE ╦ERNAL ╥╙-232 ROUTINES,
  72. AND THE ├OMMODORE ╬═╔ HANDLER, SEE "├╧═╨╒╘┼!'S ╓╔├-20 AND ├OMMODORE 64 ╘OOL
  73. ╦IT: ╦ERNAL", BY ─AN ╚EEB (├╧═╨╒╘┼! ┬OOKS) AND "╫HAT'S ╥EALLY ╔NSIDE THE
  74. ├OMMODORE 64", BY ═ILTON ┬ATHURST (DISTRIBUTED IN THE ╒╙ BY ╙CHNEDLER
  75. ╙YSTEMS).
  76.  
  77. 3. ┴├╔┴ ╥┼╟╔╙╘┼╥╙
  78.  
  79. ╘HE FOUR ┴├╔┴ REGISTERS ARE EXPLAINED IN DETAIL IN THE ENCLOSED DATA SHEETS.
  80. ╘HE DEFAULT LOCATION FOR THEM IN OUR CARTRIDGE IS ADDRESS $─┼00--$─┼03
  81. (56832--56836).
  82.  
  83. 3.1. ─┴╘┴ ╥┼╟╔╙╘┼╥ ($─┼00)
  84.  
  85. ╘HIS REGISTER HAS DUAL FUNCTIONALITY: IT IS USED TO RECEIVE AND TRANSMIT ALL
  86. DATA BYTES (I.E., IT IS A READ/WRITE REGISTER).
  87.  
  88. ─ATA RECEIVED BY THE ┴├╔┴ IS PLACED IN THIS REGISTER.  ╔F RECEIVE INTERRUPTS
  89. ARE ENABLED, AN INTERRUPT WILL BE GENERATED WHEN ALL BITS FOR A RECEIVED
  90. BYTE HAVE BEEN ASSEMBLED AND THE BYTE IS READY TO READ.
  91.  
  92. ╘RANSMIT INTERRUPTS, IF ENABLED, ARE GENERATED WHEN THIS REGISTER IS EMPTY
  93. (AVAILABLE FOR TRANSMITTING).  ┴ BYTE TO BE TRANSMITTED CAN BE PLACED IN THIS
  94. REGISTER.
  95.  
  96. 3.2. ╙╘┴╘╒╙ ╥┼╟╔╙╘┼╥ ($─┼01)
  97.  
  98. ╘HIS REGISTER HAS DUAL FUNCTIONALITY: IT SHOWS THE VARIOUS ┴├╔┴ SETTINGS WHEN
  99. READ, BUT WHEN WRITTEN TO (DATA = ANYTHING [I.E., DON'T CARE]), THIS REGISTER
  100. TRIGGERS A RESET OF THE CHIP.
  101.  
  102. ┴S THE ENCLOSED DATA SHEET SHOWS, THE ┴├╔┴ USES BITS IN THIS REGISTER TO
  103. INDICATE DATA FLOW AND ERRORS.
  104.  
  105. ╔F THE ┴├╔┴ GENERATES AN INTERRUPT, BIT #7 IS SET.  ╘HERE ARE FOUR POSSIBLE
  106. SOURCES OF INTERRUPTS:
  107.  
  108. 1) RECEIVE (IF PROGRAMMED)
  109. 2) TRANSMIT (IF PROGRAMMED)
  110. 3) IF A CONNECTED DEVICE CHANGES THE STATE OF THE ─├─ LINE
  111. 4) IF A CONNECTED DEVICE CHANGES THE STATE OF THE ─╙╥ LINE
  112.  
  113. ╙OME PROGRAMMERS HAVE REPORTED PROBLEMS WITH USING BIT #7 TO VERIFY ┴├╔┴
  114. INTERRUPTS.  ┴T 9600 BPS AND HIGHER, THE ┴├╔┴ GENERATES INTERRUPTS PROPERLY,
  115. AND BITS #3--#6 (DESCRIBED BELOW) ARE SET TO REFLECT THE CAUSE OF THE
  116. INTERRUPT, AS THEY SHOULD.  ┬UT, BIT #7 IS NOT CONSISTENTLY SET.  ┴T SPEEDS
  117. UNDER 9600 BPS, BIT #7 SEEMS TO WORK AS DESIGNED.  ╘O AVOID ANY DIFFICULTIES,
  118. THE SAMPLE CODE BELOW IGNORES BIT #7 AND TESTS THE FOUR INTERRUPT SOURCE BITS
  119. DIRECTLY.
  120.  
  121. ┬IT #5 INDICATES THE STATUS OF THE ─╙╥ LINE CONNECTED TO THE ╥╙-232 DEVICE
  122. (MODEM, PRINTER, ETC.), WHILE BIT #6 INDICATES THE STATUS OF THE ─├─ LINE.
  123. ╬╧╘┼: ╘HE FUNCTION OF THESE TWO BITS IS _REVERSED_ FROM THE STANDARD
  124. IMPLEMENTATION.  ╒NLIKE MANY ┴├╔┴S, THE 6551 WAS DESIGNED TO USE THE ─├─
  125. (─ATA ├ARRIER ─ETECT) SIGNAL FROM THE MODEM TO ACTIVATE THE RECEIVER SECTION
  126. OF THE CHIP.  ╔F ─├─ IS INACTIVE (NO CARRIER DETECTED), THE MODEM MESSAGES
  127. AND ECHOS OF COMMANDS WOULD NOT APPEAR ON THE USER'S SCREEN.  ╫E WANTED THE
  128. RECEIVER ACTIVE AT ALL TIMES.  ╫E ALSO WANTED TO GIVE THE YOU ACCESS TO THE
  129. ─├─ SIGNAL FROM THE MODEM.  ╙O, WE EXCHANGED THE ─├─ AND ─╙╥ SIGNALS AT THE
  130. ┴├╔┴.  ┬OTH LINES ARE PULLED ACTIVE INTERNALLY BY THE CARTRIDGE IF LEFT
  131. UNCONNECTED BY THE USER (I.E., IN AN NULL-MODEM CABLE POSSIBILITY).
  132.  
  133. ┬IT #4 IS SET IF THE TRANSMIT REGISTER IS EMPTY.  ┘OUR PROGRAM MUST MONITOR
  134. THIS BIT AND NOT WRITE TO THE DATA REGISTER UNTIL THE BIT I SSET (SEE THE
  135. SAMPLE ╪═╔╘ CODE BELOW).
  136.  
  137. ┬IT #3 IS SET IF THE RECEIVE REGISTER IS FULL.
  138.  
  139. ┬ITS #2, #1, AND #0, WHEN SET, INDICATE OVERRUN, FRAMING, AND PARITY ERRORS IN
  140. RECEIVED BYTES.  ╘HE NEXT DATA BYTE RECEIVED ERASES THE ERROR INFORMATION FOR
  141. THE PRECEDING BYTE.  ╔F YOU WISH TO USE THESE BITS, STORE THEM FOR PROCESSING
  142. BY YOUR PROGRAM.  ╘HE SAMPLE CODE BELOW DOES NOT IMPLEMENT ANY ERROR CHECKING,
  143. BUT THE ╦ERNAL SOFTWARE ROUTINES DO, SO ADDING FEATURES TO YOUR CODE MIGHT BE
  144. A GOOD IDEA.
  145.  
  146. 3.3. ├╧══┴╬─ ╥┼╟╔╙╘┼╥ ($─┼02)
  147.  
  148. ╘HE ├OMMAND ╥EGISTER CONTROL PARITY CHECKING, ECHO MODE, AND TRANSMIT/RECEIVE
  149. INTERRUPTS.  ╔T IS A READ/WRITE REGISTER, BUT READING THE REGISTER SIMPLY
  150. TELLS YOU WHAT THE SETTINGS OF THE VARIOUS PARAMETERS ARE.
  151.  
  152. ┘OU USE BITS #7, #6, AND #5 TO CHOOSE THE PARITY CHECKING DESIRED.
  153.  
  154. ┬IT #4 SHOULD NORMALLY BE CLEARED (I.E., NO ECHO)
  155.  
  156. ┬ITS #3 AND #2 SHOULD REFLECT WHETHER OR NOT YOU ARE USING TRANSMIT
  157. INTERRUPTS, AND IF SO, WHAT KIND.  ╔N THE FIRST SAMPLE TRANSMIT ROUTINE BELOW,
  158. BIT #3 IS SET AND BIT #2 IS CLEARED TO DISABLE TRANSMIT INTERRUPTS (WITH ╥╘╙
  159. LOW [ACTIVE]) ON STARTUP.  ╚OWEVER, WHEN A BYTE IS PLACED IN THE TRANSMIT
  160. BUFFER, BIT #3 IS CLEARED AND BIT #2 IS SET TO ENABLE TRANSMIT INTERRUPTS
  161. (WITH ╥╘╙ LOW).  ╫HEN ALL BYTES IN THE BUFFER HAVE BEEN TRANSMITTED, THE
  162. INTERRUPT HANDLER DISABLES TRANSMIT INTERRUPTS.  ╬╧╘┼: ╔F YOU ARE CONNECTED TO
  163. A ╥╙-232 DEVICE THAT USES ├╘╙/╥╘╙ HANDSHAKING, YOU CAN TELL THE DEVICE TO STOP
  164. TEMPORARILY BY BRINGING ╥╘╙ HIGH (INACTIVE): CLEAR BOTH BITS #2 AND #3.
  165.  
  166. ┬IT #1 SHOULD REFLECT WHETHER OR NOT YOU ARE USING RECEIVE INTERRUPTS.  ╔N
  167. THE SAMPLE CODE BELOW, IT IS SET TO ENABLE RECEIVE INTERRUPTS.
  168.  
  169. ┬IT #0 ACTS AS A "MASTER CONTROL SWITCH" FOR ALL INTERRUPTS ON THE CHIP
  170. ITSELF.  ╔T _MUST_ BE SET TO ENABLE ANY INTERRUPTS -- IF IT IS CLEARED, ALL
  171. INTERRUPTS ARE TURNED OFF AND THE RECEIVER SECTION OF THE CHIP IS DISABLED.
  172. ╘HIS BIT ALSO PULLS THE ─╘╥ LINE LOW TO ENABLE COMMUNICATION WITH THE
  173. CONNECTED ╥╙-232 DEVICE.  ├LEARING THIS BIT CAUSES MOST ╚AYES-COMPATIBLE
  174. MODEMS TO HANG UP (BY BRINGING ─╘╥ HIGH).  ╘HIS BIT SHOULD BE CLEARED WHEN A
  175. SESSION IS OVER AND THE USER EXITS THE TERMINAL PROGRAM TO INSURE THAT NO
  176. SPURIOUS INTERRUPTS ARE GENERATED.  ╧NE FAIRLY ELEGANT WAY TO DO THIS IS TO
  177. PERFORM A SOFTWARE RESET OF THE CHIP (WRITING ANY VALUE TO THE ╙TATUS
  178. REGISTER).
  179.  
  180. ╬╧╘┼: ╔N THE FIGURES ON THE 6551 DATA SHEET, THERE ARE SMALL CHARTS AT THE
  181. BOTTOM OF EACH OF THE LABELLED "╚ARDWARE ╥ESET/╨ROGRAM ╥ESET".  ╘HESE CHARTS
  182. INDICATE WHAT VALUES THE BITS OF THESE REGISTERS CONTAIN AFTER A HARDWARE
  183. RESET (LIKE TOGGLING THE COMPUTER'S POWER) AND A PROGRAM RESET (A WRITE TO THE
  184. ╙TATUS REGISTER).
  185.  
  186. 3.4. ├╧╬╘╥╧╠ ╥┼╟╔╙╘┼╥ ($─┼03)
  187.  
  188. ┘OU USE THIS REGISTER TO CONTROL THE NUMBER OF STOP BITS, THE WORD LENGTH,
  189. SWITCH ON THE INTERNAL BAUD-RATE GENERATOR, AND SET THE BAUD RATE.  ╔T IS A
  190. READ/WRITE REGISTER, BUT READING THE REGISTER SIMPLY TELLS YOU WHAT THE
  191. VARIOUS PARAMETERS ARE.  ╙EE THE FIGURE IN THE DATA SHEET FOR A COMPLETE LIST
  192. OF PARAMETERS.
  193.  
  194. ┬E SURE THAT BIT #4, THE "CLOCK SOURCE" BIT, IS ALWAYS SET TO USE THE ON-CHIP
  195. CRYSTAL-CONTROLLED BAUD-RATE GENERATOR.
  196.  
  197. ┘OU USE THE OTHER BITS TO CHOOSE THE BAUD RATE, WORD LENGTH, AND NUMBER OF
  198. STOP BITS.  ╬OTE THAT OUR CARTRIDGE USES A DOUBLE-SPEED CRYSTAL, SO VALUES
  199. GIVEN ON THE DATA SHEET ARE DOUBLED [THIS IS HOW THEY ARE SHOWN BELOW] (THE
  200. MINIMUM SPEED IS 100 BPS AND THE MAXIMUM SPEED IS 38,400 BPS).
  201.  
  202. 4. ┴├╔┴ ╚┴╥─╫┴╥┼ ╔╬╘┼╥╞┴├╔╬╟
  203.  
  204. ╘HE ┴├╔┴ IS MOUNTED ON A CIRCUIT BOARD DESIGNED TO PLUG INTO THE EXPANSION
  205. (CARTRIDGE) PORT.  ╘HE BOARD IS HOUSED IN A CARTRIDGE SHELL WITH A MALE ─┬-9
  206. CONNECTOR AT THE REAR.  ╘HE "╔┬═(╥) ╨├/┴╘(╘═) STANDARD" ─┬-9 ╥╙-232 PINOUT IS
  207. IMPLEMENTED.  ├OMMERCIAL ─┬-9 TO ─┬-25 PATCH CORDS ARE READILY AVAILABLE, AND
  208. ARE SOLD BY US AS WELL.
  209.  
  210. ┼IGHT OF THE NINE LINES FROM THE ┴╘ SERIAL PORT ARE IMPLEMENTED: ╘X─, ╥X─,
  211. ─╘╥, ─╙╥, ╥╘╙, ├╘╙, ─├─, & ╟╬─.  ╥╔ (╥ING ╔NDICATOR) IS NOT IMPLEMENTED
  212. BECAUSE THE 6551 DOES NOT HAVE A PIN TO HANDLE IT.  ├╘╙ AND ╥╘╙ ARE NOT
  213. NORMALLY USED BY 2400 BPS OR SLOWER ╚AYES-COMPATIBLE MODEMS, BUT THESE LINES
  214. ARE BEING USED BY SEVERAL NEWER, FASTER MODEMS (═╬╨ MODEMS IN PARTICULAR).
  215. ╬OTE THAT ALTHOUGH ├╘╙ IS CONNECTED TO THE 6551, THERE IS NO WAY TO MONITOR
  216. WHAT STATE IT IS -- THE VALUE DOES NOT APPEAR IN ANY REGISTER.  ╘HE 6551
  217. HANDLES ├╘╙ AUTOMATICALLY: IF IT IS PULLED HIGH (INACTIVE) BY THE CONNECTED
  218. ╥╙-232 DEVICE, THE 6551 STOPS TRANSMITTING (CLEARS THE "TRANSMIT DATA REGISTER
  219. EMPTY" BIT [#4] IN THE STATUS REGISTER).
  220.  
  221. ╘HE OUTPUT SIGNALS ARE STANDARD ╥╙-232 LEVEL COMPATIBLE.  ╫E'VE TESTED UNITS
  222. WITH SEVERAL COMMERCIAL MODEMS AND WITH VARIOUS COMPUTERS USING NULL-MODEM
  223. CABLES UP TO 38,400 BPS WITHOUT DIFFICULTIES.  ╔N ADDITION, THERE ARE PULL-UP
  224. RESISTORS ON THREE OF THE FOUR INPUT LINES (─├─, ─╙╥, ├╘╙) SO THAT IF THESE
  225. PINS ARE NOT CONNECTED IN A CABLE, THOSE THREE LINES WILL PULL TO THE ACTIVE
  226. STATE.  ╞OR EXAMPLE, IF YOU HAPPEN TO USE A CABLE THAT IS MISSING THE ─├─
  227. LINE, THE PULL-UP RESISTOR WILL PULL THE LINE ACTIVE, SO THAT BIT #6 IN THE
  228. STATUS REGISTER WOULD BE CLEARED (─├─ IS ACTIVE LOW).
  229.  
  230. ┴N ON-BOARD CRYSTAL PROVIDES THE BAUD RATE CLOCK SIGNAL, WITH A MAXIMUM OF
  231. 38.4 ╦BAUD, BECAUSE WE ARE USING A DOUBLE-SPEED CRYSTAL.  ╔F POSSIBLE, TEST
  232. YOUR PROGRAM AT 38.4 ╦BAUD AS WELL AS LOWER BAUD RATES.  ╒SERS MAY FIND THIS
  233. HELPFUL FOR LOCAL FILE TRANSFERS USING THE ├-64/├-128 AS A DUMB TERMINAL ON
  234. LARGER SYSTEMS.  ┴ND, AFTER ALL, LOW-COST 28.8 ╦B MODEMS FOR THE MASSES ARE
  235. JUST AROUND THE CORNER.
  236.  
  237. ─EFAULT DECODING FOR THE ┴├╔┴ ADDRESSES IS DONE BY THE ╔/╧ #1 LINE (PIN 7) ON
  238. THE CARTRIDGE PORT.  ╘HIS LINE IS INFREQUENTLY USED ON EITHER THE ├-64 OR
  239. ├-128 AND SHOULD ALLOW COMPATIBILITY WITH MOST OTHER CARTRIDGE PRODUCTS,
  240. INCLUDING THE ╥┼╒.  ╘HE CIRCUIT BOARD ALSO HAS PADS FOR USERS WITH SPECIAL
  241. NEEDS TO CHANGE THE DECODING TO ╔/╧ #2 (PIN 10).  ╘HIS CHANGE MOVES THE ┴├╔┴
  242. BASE ADDRESS TO $─╞00, MAKING IT INCOMPATIBLE WITH THE ╥┼╒.
  243.  
  244. ├-128 USERS MAY ALSO ELECT TO DECODE THE ┴├╔┴ AT $─700 (THIS IS A ╙╔─-CHIP
  245. MIRROR ON THE ├-64).  ╙INCE A $─700 DECODING LINE IS NOT AVAILABLE AT THE
  246. EXPANSION PORT, THE USER WOULD NEED TO RUN A CLIP LEAD INTO THE COMPUTER AND
  247. CONNECT TO PIN 12 OF ╒2 (A 74╠╙138).  ╫E HAVE TRIED THIS AND IT WORKS.  $─700
  248. IS AN ESPECIALLY ATTRACTIVE LOCATION FOR ├-128 ┬┬╙ AUTHORS, BECAUSE PUTTING
  249. THE ╙WIFT╠INK THERE WILL FREE UP THE OTHER TWO MEMORY SLOTS FOR DEVICES THAT
  250. MANY ┬┬╙ SYSOPS USE: ╔┼┼┼ AND HARD-DRIVE INTERFACES.
  251.  
  252. ┴LTHOUGH WE ANTICIPATE RELATIVELY FEW PEOPLE CHANGING ┴├╔┴ DECODING, YOU
  253. SHOULD ALLOW YOUR SOFTWARE TO WORK WITH A ╙WIFT╠INK AT ANY OF THE THREE
  254. LOCATIONS.  ┘OU COULD EITHER (1) TEST FOR THE ┴├╔┴ AUTOMATICALLY BY WRITING A
  255. VALUE TO THE CONTROL REGISTER AND THEN ATTEMPTING TO READ IT BACK OR (2)
  256. PROVIDE A USER-CONFIGURABLE SWITCH/POKE/MENU OPTION.
  257.  
  258. ╘HE ┌80 ├╨╒ USED FOR ├╨/═ MODE IN THE ├-128 IS NOT CONNECTED TO THE ╬═╔ LINE,
  259. WHICH POSES A PROBLEM SINCE THE CLEANEST SOFTWARE INTERFACE FOR ├-64/├-128-
  260. MODE PROGRAMMING IS WITH THIS INTERRUPT.  ╫E HAVE ADDED A SWITCH TO ALLOW THE
  261. ┴├╔┴ INTERRUPT TO BE CONNECTED TO EITHER ╬═╔ OR ╔╥╤, WHICH THE ┌80 DOES USE.
  262. ╘HE USER CAN MOVE THIS SWITCH WITHOUT OPENING THE CARTRIDGE.
  263.  
  264. 5. ╙┴═╨╠┼ ├╧─┼
  265.  
  266. ╘HIS SECTION HAS BEEN TRANSLATED INTO ┴├┼-ASSEMBLER FORMAT.  ├UT ON THE DOTTED
  267. LINES TO EXTRACT THE CODE, AND ASSEMBLE IT USING THE ┴├┼ ASSEMBLER (┴├┼ IS A
  268. PUBLIC-DOMAIN PROGRAM).  ╘HIS PROGRAM WILL WORK ON BOTH THE ├64 AND ├128.
  269. ╘O USE FROM ┬┴╙╔├:
  270.  
  271. ╠╧┴─"╙┴═╨╠┼",8,1
  272. ╙┘╙8192
  273.  
  274. ╔T IS A VERY SIMPLE TERMINAL PROGRAM.  ╨RESS THE ╙╘╧╨ KEY TO EXIT FROM IT.
  275.  
  276. %%%---8<---CUT-HERE---8<---%%%
  277. ;╙AMPLE ╬═╔ INTERRUPT HANDLER FOR 6551 ┴├╔┴ ON ├OMMODORE 64/128
  278.  
  279. ;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
  280. ;╟EODUCK ─EVELOPMENT ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
  281.  
  282. ;    ---=== ┼╤╒┴╘┼╙ ===---
  283.  
  284. BASE      =    $─┼00    ;BASE ┴├╔┴ ADDRESS
  285. DATA      =    BASE
  286. STATUS    =    BASE+1
  287. COMMAND   =    BASE+2
  288. CONTROL   =    BASE+3
  289.  
  290. ;╒SING THE ┴├╔┴ FREES MANY ADDRESSES IN ZERO PAGE NORMALLY USED BY
  291. ;╦ERNEL ╥╙-232 ROUTINES.  ╘HE ADDRESSES FOR THE BUFFER POINTERS WERE
  292. ;CHOSEN ARBITRARILY.  ╘HE BUFFER VECTOR ADDRESSES ARE THOSE USED BY
  293. ;THE ╦ERNAL ROUTINES.
  294.  
  295. RHEAD     =   $┴7      ;POINTER TO NEXT BYTE TO BE REMOVED FROM
  296.                        ;RECEIVE BUFFER
  297. RTAIL     =   $┴8      ;POINTER TO LOCATION TO STORE NEXT BYTE RECEIVED
  298. RBUFF     =   $╞7      ;RECEIVE-BUFFER VECTOR
  299.  
  300. THEAD     =   $┴9      ;POINTER TO NEXT BYTE TO BE REMOVED FROM
  301.                        ;TRANSMIT BUFFER
  302. TTAIL     =   $┴┴      ;POINTER TO LOCATION TO STORE NEXT BYTE
  303.                        ;IN TRANSMIT BUFFER
  304. TBUFF     =   $╞9      ;TRANSMIT BUFFER
  305.  
  306. XMITCOUNT =   $┴┬      ;COUNT OF BYTES REMAINING IN TRANSMIT (XMIT) BUFFER
  307. RECVCOUNT =   $┬4      ;COUNT OF BYTES REMAINING IN RECEIVE BUFFER
  308.  
  309. ERRORS    =   $┬5      ;─╙╥, ─├─, AND RECEIVED DATA ERRORS INFORMATION
  310.  
  311. XMITON    =   $┬6      ;STORAGE LOCATION FOR MODEL OF COMMAND REGISTER
  312.                        ;WHICH TURN BOTH RECEIVE AND TRANSMIT INTERRUPTS ON
  313. XMITOFF   =   $┬─      ;STORAGE LOCATION FOR MODEL OF COMMAND REGISTER
  314.                        ;WHICH TURNS THE RECEIVE INTERRUPT ON AND THE
  315.                        ;TRANSMIT INTERRUPTS OFF
  316.  
  317. ╬═╔╬╓     =   $0318    ;├OMMODORE ╬ON-═ASKABLE ╔NTERRUPT VECTOR
  318. ╧╠─╓┼├    =   $03FE    ;INNOCUOUS LOCATION TO STORE OLD ╬═╔ VECTOR (TWO BYTES)
  319.  
  320. ;    ---=== ╔╬╔╘╔┴╠╔┌┴╘╔╧╬ ===---
  321.  
  322. ;├ALL THE FOLLOWING CODE AS PART OF SYSTEM INITIALIZATION.
  323.  
  324. ;CLEAR ALL BUFFER POINTERS, BUFFER COUNTERS, AND ERRORS LOCATION
  325.  
  326.       ORG   $2000      ;CHANGE TO SUIT YOUR NEEDS
  327.       LDA   #$00
  328.       STA   RHEAD
  329.       STA   RTAIL
  330.       STA   THEAD
  331.       STA   TTAIL
  332.  
  333.       STA   XMITCOUNT
  334.       STA   RECVCOUNT
  335.       STA   ERRORS
  336.  
  337. ;STORE THE ADDRESSES OF THE BUFFERS IN THE ZERO-PAGE VECTORS
  338.  
  339.       LDA   #<╘╥┴╬╙═╔╘_┬╒╞╞┼╥
  340.       STA   TBUFF
  341.       LDA   #>╘╥┴╬╙═╔╘_┬╒╞╞┼╥
  342.       STA   TBUFF + 1
  343.  
  344.       LDA   #<╥┼├┼╔╓┼_┬╒╞╞┼╥
  345.       STA   RBUFF
  346.       LDA   #>╥┼├┼╔╓┼_┬╒╞╞┼╥
  347.       STA   RBUFF + 1
  348.  
  349. ;THE NEXT FOUR INSTRUCTIONS INITIALIZE THE ┴├╔┴ TO ARBITRARY VALUES.
  350. ;╘HESE COULD BE PROGRAM DEFAULTS, OR REPLACED BY CODE THAT PICKS UP
  351. ;THE USER'S REQUIREMENTS FOR BAUD RATE, PARITY, ETC.
  352.  
  353. ;╘HE ┴├╔┴ "CONTROL" REGISTER CONTROLS STOP BITS, WORD LENGTH, THE
  354. ;CHOICE OF INTERNAL OR EXTERNAL BAUD-RATE GENERATOR, AND THE BAUD
  355. ;RATE WHEN THE INTERNAL GENERATOR IS USED.  ╘HE VALUE BELOW SETS THE
  356. ;┴├╔┴ FOR ONE STOP BIT, EIGHT-BIT WORD LENGTH, AND 4800 BAUD USING THE
  357. ;INTERNAL GENERATOR.
  358. ;             .------------------------- 0 = ONE STOP BIT
  359. ;             :
  360. ;             :.-------------------- WORD LENGTH, BITS 6-7
  361. ;             ::.------------------- 00 = EIGHT-BIT WORD
  362. ;             :::
  363. ;             :::.------------- CLOCK SOURCE, 1 = INTERNAL GENERATOR
  364. ;             ::::
  365. ;             :::: .----- BAUD
  366. ;             :::: :.---- RATE
  367. ;             :::: ::.--- BITS   ;1010 == 4800 BAUD, CHANGE TO WHAT YOU WANT
  368. ;             :::: :::.-- 0-3
  369.       LDA   #%0001_1010
  370.       STA   CONTROL
  371.  
  372. ;╘HE ┴├╔┴ "COMMAND" REGISTER CONTROLS THE PARITY, ECHO MODE, TRANSMIT AND
  373. ;RECEIVE INTERRUPT ENABLING, HARDWARE "┬╥╦", AND (INDIRECTLY) THE "╥╘╙"
  374. ;AND "─╘╥" LINES.  ╘HE VALUE BELOW SETS THE ┴├╔┴ FOR NO PARITY CHECK,
  375. ;NO ECHO, DISABLES TRANSMIT INTERRUPTS, AND ENABLES RECEIVE INTERRUPTS
  376. ;(╥╘╙ AND ─╘╥ LOW).
  377. ;             .------------------------- PARITY CONTROL,
  378. ;             :.------------------------ BITS 5-7
  379. ;             ::.----------------------- 000 = NO PARITY
  380. ;             :::
  381. ;             :::.------------------- ECHO MODE, 0 = NORMAL (NO ECHO)
  382. ;             ::::
  383. ;             :::: .----------- TRANSMIT INTERRUPT CONTROL, BITS 2-3
  384. ;             :::: :.---------- 10 = XMIT INTERRUPT OFF, ╥╘╙ LOW
  385. ;             :::: ::
  386. ;             :::: ::.------ RECEIVE INTERRUPT CONTROL, 0 = ENABLED
  387. ;             :::: :::
  388. ;             :::: :::.--- ─╘╥ CONTROL, 1=─╘╥ LOW
  389.       LDA   #%0000_1001
  390.       STA   COMMAND
  391.  
  392. ;┬ESIDES INITIALIZATION, ALSO CALL THE FOLLOWING CODE WHENEVER THE USER
  393. ;CHANGES PARITY OF ECHO MODE.
  394. ;╔T CREATES THE "XMITOFF" AND "XMITON" MODELS USED BY THE INTERRUPT
  395. ;HANDLER AND MAIN-PROGRAM TRANSMIT ROUTINE TO CONTROL THE ┴├╔┴
  396. ;INTERRUPT ENABLING.  ╔F YOU DON'T CHANGE THE MODELS' PARITY BITS,
  397. ;YOU'LL REVERT TO "DEFAULT" PARITY ON THE NEXT ╬═╔.
  398.  
  399.                         ;INITIALIZE WITH TRANSMIT INTERRUPTS OFF SINCE
  400.                         ;BUFFER WILL BE EMPTY
  401.  
  402.       STA   XMITOFF     ;STORE AS A MODEL FOR FUTURE USE
  403.       AND   #%1111_0000 ;MASK OFF INTERRUPT BITS, KEEP PARITY/ECHO BITS
  404.       ORA   #%0000_0101 ;AND SET BITS TO ENABLE BOTH TRANSMIT AND
  405.                         ;RECEIVE INTERRUPTS
  406.       STA   XMITON      ;STORE ALSO FOR FUTURE USE
  407.  
  408. ;╘HE STANDARD ╬═╔ ROUTINE TESTS TH <╥┼╙╘╧╥┼> KEY, ├╔┴ #2, AND CHECKS
  409. ;FOR THE PRESENCE OF AN AUTOSTART CARTRIDGE.
  410.  
  411. ;┘OU CAN SAFELY BYPASS THE NORMAL ROUTINE UNLESS:
  412. ;       *  YOU WANT TO KEEP THE USER PORT ACTIVE
  413. ;       *  YOU WANT TO USE THE ╘╧─ CLOCK IN ├╔┴ #2
  414. ;       *  YOU WANT TO DETECT AN AUTOSTART CARTRIDGE
  415. ;       *  YOU WANT TO DETECT THE ╥┼╙╘╧╥ KEY
  416. ;
  417. ;╔F YOU NEED ANY OF THESE FUNCTIONS, YOU CAN WEDGE THE ┴├╔┴
  418. ;INTERRUPT HANDLER IN AHEAD OF THE ╦ERNAL ROUTINES.  ╔T'S PROBABLY
  419. ;SAFER TO REPLICATE IN YOUR OWN PROGRAM ONLY THE ╦ERNAL ╬═╔ FUNCTIONS
  420. ;THAT YOU NEED.  ╫E'LL ILLUSTRATE BYPASSING ALL ╦ERNAL TESTS.
  421.  
  422. ;┬┼ ╙╒╥┼ ╘╚┼ "╬┼╫╬═╔" ╥╧╒╘╔╬┼ ╔╙ ╔╬ ╨╠┴├┼ ┬┼╞╧╥┼ ┼╪╔╘╔╬╟ ╘╚╔╙ ├╧─┼!
  423. ;┴ "STRAY" ╬═╔ THAT OCCURS AFTER THE VECTOR IS CHANGED TO ╬┼╫╬═╔'S ADDRESS
  424. ;WILL PROBABLY CAUSE A SYSTEM CRASH IF ╬┼╫╬═╔ ISN'T THERE.  ┴LSO, IT WOULD
  425. ;BE BEST TO INITIALIZE THE ┴├╔┴ TO A "NO INTERRUPTS" STATE UNTIL THE
  426. ;NEW VECTOR IS STORED.  ┴LTHOUGH A POWER-ON RESET SHOULD DISABLE ALL
  427. ;┴├╔┴ INTERRUPTS, IT PAYS TO BE SURE.
  428.  
  429. ;╔F THE USER TURNS THE MODEM OFF AND ON, AN INTERRUPT WILL PROBABLY BE
  430. ;GENERATED.  ┴T WORST, THIS MAY LEAVE A STRAY CHARACTER IN TEH RECEIVE
  431. ;BUFFER, UNLESS YOU DON'T HAVE ╬┼╫╬═╔ IN PLACE.
  432.  
  433. ╬┼╫╓┼├:
  434.       SEI               ;┴ STRAY ╔╥╤ SHOULDN'T CAUSE ANY PROBLEMS
  435.                         ;WHILE WE'RE CHANGING THE ╬═╔ VECTOR, BUT
  436.                         ;WHY TAKE CHANCES?
  437.  
  438. ;╔F YOU WANT ALL THE NORMAL ╬═╔ TESTS TO OCCUR AFTER THE ┴├╔┴ CHECK,
  439. ;SAVE THE OLD VECTOR.  ╔F YOU DON'T NEED THE REGULAR STUFF, YOU CAN
  440. ;SKIP THE NEXT FOUR LINES.  ╬OTE THAT THE ╦ERNAL ╬═╔ ROUTINE PUSHES
  441. ;THE ├╨╒ REGISTERS TO THE STACK.  ╔F YOU CALL IT AT THE NORMAL ADDRESS,
  442. ;YOU SHOULD POP THE REGISTERS FIRST (SEE ┼╪╔╘╔╬╘ BELOW).
  443.  
  444.       LDA   ╬═╔╬╓      ;GET LOW BYTE OF PRESENT VECTOR
  445.       STA   ╧╠─╓┼├     ;AND STORE IT FOR FUTURE USE
  446.       LDA   ╬═╔╬╓+1    ;DO THE SAME
  447.       STA   ╧╠─╓┼├+1   ;WITH THE HIGH BYTE
  448.  
  449.                        ;COME HERE FROM THE ╙┼╔ IF YOU'RE NOT SAVING
  450.                        ;THE OLD VECTOR
  451.       LDA   #<╬┼╫╬═╔   ;GET LOW BYTE OF NEW ╬═╔ ROUTINE
  452.       STA   ╬═╔╬╓      ;STORE IN VECTOR
  453.       LDA   #>╬┼╫╬═╔   ;AND DO THE SAME WITH
  454.       STA   ╬═╔╬╓+1    ;THE HIGH BYTE
  455.  
  456.       CLI              ;ALLOW ╔╥╤S AGAIN
  457.  
  458. ;CONTINUE INITIALIZING YOUR PROGRAM
  459.  
  460. ;     :::   ::::::     ;PROGRAM INITIALIZATION CONTINUES
  461.       JMP   ╘┼╥═╔╬┴╠   ;GO TO THE EXAMPLE DUMB-TERMINAL SUBROUTINE
  462.  
  463. ;╙AVE TWO BYTES TO STORE THE OLD VECTOR ONLY IF YOU NEED IT
  464.  
  465.  
  466. ;    ---=== ╬EW ╬═╔ ╥OUTINE ╙TARTS ╚ERE ===---
  467.  
  468. ;╘HE CODE BELOW IS A SIMPLE INTERRUPT PATCH TO CONTROL THE ┴├╔┴.  ╫HEN
  469. ;THE ┴├╔┴ GENERATES AN INTERRUPT, THIS ROUTINE EXAMINES THE STATUS
  470. ;REGISTER WHICH CONTAINS THE FOLLOWING DATA.
  471.  
  472. ;             .---------------------------- HIGH IF ┴├╔┴ CAUSED INTERRUPT;
  473. ;             :                             NOT USED IN CODE BELOW
  474. ;             :
  475. ;             :.------------------------- REFLECTS STATE OF ─├─ LINE
  476. ;             ::
  477. ;             ::.---------------------- REFLECTS STATE OF ─╙╥ LINE
  478. ;             :::
  479. ;             :::.------------------ HIGH IF XMIT-DATA REGISTER IS EMPTY
  480. ;             ::::
  481. ;             :::: .--------------- HIGH IF RECEIVE-DATA REGISTER FULL
  482. ;             :::: :
  483. ;             :::: :.----------- HIGH IF OVERRUN ERROR
  484. ;             :::: ::
  485. ;             :::: ::.------- HIGH IF FRAMING ERROR
  486. ;             :::: :::
  487. ;             :::: :::.--- HIGH IF PARITY ERROR
  488. ;     STATUS  XXXX_XXXX
  489.  
  490. ╬┼╫╬═╔:
  491. ;     SEI              ;THE ╦ERNAL ROUTINE ALREADY DOES THIS BEFORE JUMPING
  492.                        ;THROUGH THE ╬═╔╬╓ VECTOR
  493.       PHA              ;SAVE ┴ REGISTER
  494.       TXA
  495.       PHA              ;SAVE ╪ REGISTER
  496.       TYA
  497.       PHA              ;SAVE ┘ REGISTER
  498.  
  499. ;┴S DISCUSSED ABOVE, THE ┴├╔┴ CAN GENERATE AN INTERRUPT FROM ONE OF FOUR
  500. ;DIFFERENT SOURCES.  ╫E'LL FIRST CHECK TO SEE IF THE INTERRUPT WAS
  501. ;CAUSED BY THE RECEIVE REGISTER BEING FULL (BIT #3) OR THE TRANSMIT
  502. ;REGISTER BEING EMPTY (BIT #4) SINCE THESE TWO ACTIVITIES SHOULD RECEIVE
  503. ;PRIORITY.  ┴ ┬┼╤ (┬RANCH IF ┼╤UAL) TESTS THE STATUS REGISTER AND BRANCHES
  504. ;IF THE INTERRUPT WAS NOT CAUSED BY THE DATA REGISTER.
  505.  
  506. ;┬EFORE TESTING FOR THE SOURCE OF THE INTERRUPT, WE'LL PREVENT MORE
  507. ;INTERRUPTS FROM THE ┴├╔┴ BY DISABLING THEM AT THE CHIP.  ╘HIS PREVENTS
  508. ;ANOTHER ╬═╔ FROM INTERRUPTING THIS ONE.  (╙┼╔ WON'T WORK BECAUSE THE
  509. ;├╨╒ CAN'T DISABLE NON-MASKABLE INTERRUPTS).
  510.  
  511. ;┴T LOWER BAUD RATES (2400 BAUD AND LOWER) THIS MAY NOT BE NECESSARY.  ┬UT,
  512. ;IT'S SAFE AND DOESN'T TAKE MUCH TIME, EITHER.
  513.  
  514. ;╘HE SAME TECHNIQUE SHOULD BE USED IN PARTS OF YOUR PROGRAM WHERE TIMING
  515. ;IS CRITICAL.  ─ISK ACCESS, FOR EXAMPLE, USES ╙┼╔ TO MASK ╔╥╤ INTERRUPTS.
  516. ;┘OU SHOULD TURN OFF THE ┴├╔┴ INTERRUPTS DURING DISK ACCESS ALSO TO PREVENT
  517. ;DISK ERRORS AND SYSTEM CRASHES.
  518.  
  519. ;╞IRST, WE'LL LOAD THE STATUS REGISTER WHICH CONTAINS ALL THE INTERRUPT
  520. ;AND ANY RECEIVED-DATA ERROR INFORMATION IN THE '┴' REGISTER.
  521.  
  522.       LDA   STATUS
  523.  
  524. ;╬OW PREVENT ANY MORE ╬═╔S FROM THE ┴├╔┴
  525.  
  526.       LDX   #%0000_0011   ;DISABLE ALL INTERRUPTS, BRING ╥╘╙ INACTIVE, AND
  527.                           ;LEAVE ─╘╥ ACTIVE
  528.       STX   COMMAND       ;SEND TO ┴├╔┴-- CODE AT END OF INTERRUPT HANDLER
  529.                           ;WILL RE-ENABLE INTERRUPTS
  530.  
  531. ;╙TORE THE STATUS-REGISTER DATA ONLY IF NEEDED FOR ERROR CHECKING.
  532. ;╘HE NEXT RECEIVED BYTE WILL CLEAR THE ERROR FLAGS.
  533.  
  534. ;     STA   ERRORS        ;ONLY IF ERROR CHECKING IMPLEMENTED
  535.  
  536.       AND   #%0001_1000   ;MASK OUT ALL BUT TRANSMIT AND
  537.                           ;RECEIVE INTERRUPT INDICATORS
  538.  
  539. ;╔F YOU DON'T USE A TRANSMIT BUFFER YOU CAN USE
  540. ;
  541. ;     AND   #%0000_1000
  542. ;
  543. ;TO TEST FOR RECEIVE INTERRUPTS ONLY AND SKIP THE RECEIVE TEST SHOWN
  544. ;BELOW.
  545.  
  546.       BEQ   ╘┼╙╘_─├─_─╙╥
  547.  
  548. ;IF THE '┴' REGISTER=0, EITHER THE INTERRUPT WAS NOT CAUSED BY THE
  549. ;┴├╔┴ OR THE ┴├╔┴ INTERRUPT WAS CAUSED BY A CHANGE IN THE ─├─ OR
  550. ;─╙╥ LINES, SO WE'LL BRANCH TO CHECK THOSE SOURCES.
  551.  
  552. ;╔F YOUR PROGRAM IGNORES ─├─ AND ─╙╥, YOU CAN BRANCH TO
  553. ;THE END OF THE INTERRUPT HANDLER INSTEAD:
  554. ;
  555. ;     BEQ   ╬═╔┼╪╔╘
  556. ;
  557.  
  558. ;╘EST THE STATUS REGISTER INFORMATION TO SEE IF A RECEIVED BYTE IS READY
  559. ;╔F YOU DON'T USE A TRANSMIT BUFFER, SKIP THE NEXT TWO INSTRUCTIONS.
  560.  
  561. ╥┼├┼╔╓┼:                  ;PROCESS RECEIVED BYTE
  562.       AND   #%0000_1000   ;MASK ALL BUT BIT #3
  563.       BEQ   ╪═╔╘├╚┴╥      ;IF NOT SET, NO RECEIVED BYTE - IF YOU'RE USING
  564.                           ;A TRANSMIT BUFFER, THE INTERRUPT MUST HAVE BEEN
  565.                           ;CAUSED BY TRANSMIT.  ╙O, BRANCH TO HANDLE.
  566.       LDA   DATA          ;GET RECEIVED BYTE
  567.       LDY   RTAIL         ;INDEX TO BUFFER
  568.       STA   (RBUFF),Y     ;AND STORE IT
  569.       INC   RTAIL         ;MOVE INDEX TO NEXT SLOT
  570.       INC   RECVCOUNT     ;INCREMENT COUNT OF BYTES IN RECEIVE BUFFER
  571.                           ;(IF USED BY YOUR PROGRAM)
  572.  
  573. ;╙KIP THE "╪═╔╘" ROUTINES BELOW IF YOU DECIDE NOT TO USE A TRANSMIT BUFFER.
  574. ;╔N THAT CASE, THE NEXT CODE EXECUTED STARTS AT ╘┼╙╘_─├─_─╙╥ OR ╬═╔┼╪╔╘.
  575.  
  576. ;┴FTER PROCESSING A RECEIVED BYTE, THIS SAMPLE CODE TESTS FOR BYTES
  577. ;IN THE TRANSMIT BUFFER AND SENDS ON IF PRESENT.  ╬OTE THAT, IN THIS
  578. ;SAMPLE, RECEIVE INTERRUPTS TAKE PRECEDENCE.  ┘OU MAY WANT TO REVERSE THE
  579. ;ORDER IN YOUR PROGRAM.
  580.  
  581. ;╔F THE ┴├╔┴ GENERATED A TRANSMIT INTERRUPT AND NO RECEIVED BYTE WAS
  582. ;READY, STATUS BIT #4 IS ALREADY SET.  ╘HE ┴├╔┴ IS READY TO ACCEPT
  583. ;THE BYTE TO BE TRANSMITTED AND WE'VE BRANCHED DIRECTLY TO ╪═╔╘├╚┴╥ BELOW.
  584.  
  585. ;╔F ONLY BIT #3 WAS SET ON ENTRY TO THE INTERRUPT HANDLER, THE ┴├╔┴ MAY HAVE
  586. ;BEEN IN THE PROCESS OF TRANSMITTING THE LAST BYTE, AND THERE MAY STILL BE
  587. ;CHARACTERS IN THE TRANSMIT BUFFER.  ╫E'LL CHECK FOR THAT NOW, AND SEND THE
  588. ;NEXT CHARACTER IF THERE IS ONE.  ┬EFORE SENDING A CHARACTER TO THE ┴├╔┴ TO
  589. ;BE TRANSMITTED, WE MUST WAIT UNTIL BIT #4 OF THE STATUS REGISTER IS SET.
  590.  
  591. ╪═╔╘:
  592.       LDA   XMITCOUNT     ;IF NOT ZERO, CHARACTERS STILL IN BUFFER
  593.                           ;FALL THROUGH TO PROCESS XMIT BUFFER
  594.       BEQ   ╘┼╙╘_─├─_─╙╥  ;NO CHARACTERS IN BUFFER-- GO TO NEXT CHECK
  595. ;OR
  596. ;
  597. ;     BEQ   ╬═╔┼╪╔╘
  598. ;
  599. ;IF YOU DON'T CHECK ─├─ OR ─╙╥ IN YOUR PROGRAM.
  600.  
  601. ╪═╔╘┬┘╘┼:
  602.       LDA   STATUS        ;TEST BIT #4
  603.       AND   #%00010000
  604.       BEQ   ╘┼╙╘_─├─_─╙╥  ;SKIP IF TRANSMITTER STILL BUSY
  605.  
  606. ╪═╔╘├╚┴╥:                 ;TRANSMIT A CHARACTER
  607.       LDY   THEAD
  608.       LDA   (TBUFF),Y     ;GET CHARACTER AT HEAD OF BUFFER
  609.       STA   DATA          ;PLACE IN ┴├╔┴ FOR TRANSMIT
  610.  
  611.                           ;POINT TO NEXT CHARACTER IN BUFFER
  612.       INC   THEAD         ;AND STORE NEW INDEX
  613.       DEC   XMITCOUNT     ;SUBTRACT ONE FROM COUNT OF BYTES
  614.                           ;IN XMIT BUFFER
  615.       LDA   XMITCOUNT
  616.       BEQ   ╘┼╙╘_─├─_─╙╥
  617. ;OR
  618. ;
  619. ;     BEQ   ╬═╔┼╪╔╘
  620. ;
  621. ;IF YOU DON'T CHECK ─├─ OR ─╙╥ IN YOUR PROGRAM
  622.  
  623. ;╔F XMITCOUNT DECREMENTS TO ZERO, THERE ARE NO MORE CHARACTERS TO
  624. ;TRANSMIT.  ╘HE CODE AT ╬═╔┼╪╔╘ TURNS ┴├╔┴ TRANSMIT INTERRUPTS OFF.
  625.  
  626. ;╔F THERE ARE MORE BYTES IN THE BUFFER, SET UP THE '┴' REGISTER WITH
  627. ;THE MODEL THAT TURNS BOTH TRANSMIT AND RECEIVE INTERRUPTS ON.  ╫E FELT
  628. ;THAT WAS SAFER, AND NOT MUCH SLOWER, THAN ┼╧╥ING BITS #3 AND #4.  ╬OTE
  629. ;THAT THE STATUS OF THE PARITY/ECHO BITS IS PRESERVED IN THE WAY "XMITON"
  630. ;AND "XMITOFF" WERE INITIALIZED EARLIER.
  631.  
  632.       LDA   XMITON        ;MODEL TO LEAVE BOTH INTERRUPTS ENABLED
  633.  
  634. ;╔F YOU DON'T USE ─├─ OR ─╙╥
  635.  
  636.       BNE   ╬═╔├╧══┴╬─    ;BRANCH ALWAYS TO STORE MODEL IN COMMAND REGISTER
  637.  
  638. ;╔F YOUR PROGRAM USES ─├─ AND/OR ─╙╥, YOU'LL WANT TO KNOW WHEN THE STATE
  639. ;OF THOSE LINES CHANGES.  ┘OU CAN DO THAT OUTSIDE THE INTERRUPT HANDLER
  640. ;BY POLLING THE ┴├╔┴ STATUS REGISTER, BUT IF EITHER OF THE LINES CHANGES,
  641. ;THE CHIP WILL GENERATE AN ╬═╔ ANYWAY.  ╙O, YOU CAN LET THE INTERRUPT
  642. ;HANDLER DO TEH WORK FOR YOU.  ╘HE COST IS THE ADDED TIME REQUIRED TO
  643. ;EXECUTE THE ─├─_─╙╥ CODE ON EACH ╬═╔.
  644.  
  645. ╘┼╙╘_─├─_─╙╥:
  646.  
  647. ;     PHA                 ;ONLY IF YOU USE A TRANSMIT BUFFER, '┴' HOLDS
  648.                           ;THE PROPER MASK TO RE-ENABLE INTERRUPTS ON
  649.                           ;THE ┴├╔┴
  650. ;     ::
  651. ;     ::                  ;APPROPRIATE CODE HERE TO COMPARE BIT #6 (─├─)
  652. ;     ::                  ;AND/OR BIT #5 (─╙╥) WITH THEIR PREVIOUS STATES
  653. ;     ::                  ;WHICH YOU'VE ALREADY STORED IN MEMORY AND TAKE
  654. ;     ::                  ;APPROPRIATE ACTION
  655. ;     ::
  656. ;     PLA                 ;ONLY IF YOU PUSHED IT AT THE START OF THE
  657.                           ;─├─/─╙╥ ROUTINE
  658. ;     BNE   ╬═╔├╧══┴╬─    ;'┴' HOLDS THE XMITON MASK IF IT'S NOT ZERO,
  659.                           ;IMPLYING THAT WE ARRIVED HERE FROM XMIT ROUTINE
  660.                           ;NOT USED IF YOU'RE NOT USING A TRANSMIT BUFFER.
  661.  
  662. ;╔F THE TEST FOR ┴├╔┴ INTERRUPT FAILED ON ENTRY TO THE HANDLER, WE BRANCH
  663. ;DIRECTLY TO HERE.  ╔F YOU DON'T USE ADDITIONAL HANDLERS, THE ╥┼╙╘╧╥┼ KEY
  664. ;(FOR EXAMPLE) WILL FALL THROUGH HERE AND HAVE NO EFFECT ON YOUR PROGRAM
  665. ;OR THE MACHINE, EXCEPT FOR SOME WASTED CYCLES.
  666.  
  667. ╬═╔┼╪╔╘:
  668.       LDA   XMITOFF       ;LOAD MODEL TO TURN TRANSMIT INTERRUPTS OFF
  669.  
  670. ;AND THIS LINE SETS THE INTERRUPT STATUS TO WHATEVER IS IN THE '┴' REGISTER.
  671.  
  672. ╬═╔├╧══┴╬─:
  673.       STA   COMMAND
  674.  
  675. ;╘HAT'S ALL WE NEED FOR THE ┴├╔┴ INTERRUPT HANDLER.  ╙INCE WE'VE PUSHED THE
  676. ;├╨╒ REGISTERS TO THE STACK, WE NEED TO POP THEM OFF.  ╬OTE THAT YOU MUST
  677. ;DO THIS ┼╓┼╬ ╔╞ ┘╧╒ ╩╒═╨ ╘╧ ╘╚┼ ╦┼╥╬┴╠ ╚┴╬─╠┼╥ ╬┼╪╘, SINCE IT WILL PUSH
  678. ;THEM AGAIN IMMEDIATELY.  ┘OU CAN SKIP THIS STEP ONLY IF YOU'RE PROCEEDING
  679. ;TO A CUSTOM HANDLER.
  680.  
  681. ┼╪╔╘╔╬╘:                  ;RESTORE THINGS AND EXIT
  682.       PLA                 ;RESTORE '┘' REGISTER
  683.       TAY
  684.       PLA                 ;RESTORE '╪' REGISTER
  685.       TAX
  686.       PLA                 ;RESTORE '┴' REGISTER
  687.  
  688. ;╔F YOU WANT TO CONTINUE PROCESSING THE INTERRUPT WITH THE ╦ERNAL ROUTINES,
  689.  
  690.       JMP   (╧╠─╓┼├)      ;CONTINUE PROCESSING INTERRUPT WITH ╦ERNAL HANDLER
  691.  
  692. ;╧R, IF YOU ADD YOUR OWN INTERRUPT ROUTINE,
  693.  
  694. ;     JMP   ┘╧╒╥├╧─┼      ;CONTINUE WITH YOUR OWN HANDLER
  695.  
  696. ;╔F YOU USE YOUR OWN ROUTINE, OR IF YOU DON'T ADD ANYTHING, ┬┼ ╙╒╥┼ TO DO
  697. ;THIS LAST (├64 ONLY):
  698.  
  699. ;     RTI                 ;RETURN FROM INTERRUPT INSTRUCTION
  700.  
  701. ;TO RESTORE THE FLAGS REGISTER THE ├╨╒ PUSHES TO THE STACK BEFORE JUMPING
  702. ;TO THE ╦ERNAL CODE.  ╔T ALSO RETURNS YOU TO THE INTERRUPTED PART OF
  703. ;YOUR PROGRAM
  704.  
  705. ;-----------------------------------------------------------------------------
  706. ;╙AMPLE ROUTINE TO STORE A CHARACTER IN THE BUFFER TO BE TRANSMITTED
  707. ;BY THE ┴├╔┴.
  708.  
  709. ;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
  710. ;╟EODUCK ─EVELOPMENTAL ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
  711.  
  712. ;┴SSUMES THE CHARACTER IS IN THE '┴' REGISTER ON ENTRY.  ─ESTROYS '┘'--
  713. ;PUSH TO STACK IF YOU NEED TO PRESERVE IT.
  714.  
  715. ╙┼╬─┬┘╘┼:                 ;ADDS A BYTE TO THE XMIT BUFFER AND SETS
  716.                           ;THE ┴├╔┴ TO ENABLE TRANSMIT INTERRUPTS (THE
  717.                           ;INTERRUPT HANDLER WILL DISABLE THEM AGAIN
  718.                           ;WHEN THE BUFFER IS EMPTY)
  719.  
  720.       LDY   XMITCOUNT     ;COUNT OF BYTES IN TRANSMIT BUFFER
  721.       CPY   #255          ;MAX BUFFER SIZE
  722.       BEQ   ╬╧╘╚╔╬╟       ;BUFFER IS FULL, DON'T ADD BYTE
  723.  
  724.       LDY   TTAIL         ;POINTER TO END OF BUFFER
  725.       STA   (TBUFF),Y     ;STORE BYTE IN '┴' AT END OF BUFFER
  726.       INC   TTAIL         ;POINT TO NEXT SLOT IN BUFFER
  727.       INC   XMITCOUNT     ;AND ADD ONE TO COUNT OF BYTES IN BUFFER
  728.  
  729.       LDA   XMITON        ;GET MODEL FOR TURNING ON TRANSMIT INTERRUPTS
  730.       STA   COMMAND       ;TELL ┴├╔┴ TO DO IT
  731.  
  732.       RTS                 ;RETURN TO YOUR PROGRAM
  733.  
  734. ╬╧╘╚╔╬╟:
  735.       LDA   #$00          ;OR WHATEVER FLAG YOUR PROGRAM USES TO TELL THAT THE
  736.                           ;BYTE WAS NOT TRANSMITTED
  737.       RTS                 ;AND RETURN
  738.  
  739. ;┴LTERNATIVE ROUTINE TO TRANSMIT A CHARACTER FROM MAIN PROGRAM WHEN NOT USING
  740. ;A TRANSMIT BUFFER.
  741. ;
  742. ;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
  743. ;╟EODUCK ─EVELOPMENTAL ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
  744. ;
  745. ;┴SSUMES THE CHARACTER TO BE TRANSMITTED IS IN THE '┴' REGISTER ON ENTRY.
  746. ;─ESTROYS '┘'; PUSH TO STACK IF YOU NEED TO PRESERVE IT.
  747. ;
  748. ;╙┼╬─┬┘╘┼:
  749. ;     TAY                 ;REMEMBER BYTE TO BE TRANSMITTED
  750. ;
  751. ;╘┼╙╘┴├╔┴:
  752. ;     LDA   STATUS        ;BIT #4 OF THE STATUS REGISTER IS SET IF
  753. ;                         ;THE ┴├╔┴ IS READY TO TRANSMIT ANOTHER BYTE,
  754. ;                         ;EVEN IF TRANSMIT INTERRUPTS ARE DISABLED.
  755. ;     AND   #%0001_0000
  756. ;     BEQ   ╘┼╙╘┴├╔┴      ;WAIT FOR BIT #4 TO BE SET
  757. ;     STY   DATA          ;GIVE BYTE TO ┴├╔┴
  758. ;     RTS
  759.  
  760. ;╙AMPLE ROUTINE TO FETCH A CHARACTER THAT HAS BEEN RECEIVED, FROM THE
  761. ;RECEIVE BUFFER.
  762.  
  763. ;BY ├RAIG ┬RUCE, 1995, ADAPTED FROM ABOVE
  764.  
  765. ;╫ILL RETURN THE CHARACTER IN THE '┴' REGISTER AND THE CARRY FLAG CLEARED IF
  766. ;A CHARACTER WAS AVAILABLE.  ╔F NO CHARACTER WAS AVAILABLE, WILL RETURN WITH
  767. ;THE CARRY FLAG SET.  ─ESTROYS THE '┘' REGISTER.
  768.  
  769. ╥┼├╓┬┘╘┼:                 ;FETCHES A BYTE FROM THE RECEIVE BUFFER.
  770.                           ;THERE IS NO NEED TO FIDDLE WITH ANY INTERRUPTS
  771.  
  772.       LDA   RECVCOUNT     ;COUNT OF BYTES IN RECEIVE BUFFER
  773.       BEQ   ╥┼├╓┼═╨╘┘     ;BUFFER IS EMPTY, INDICATE TO CALLER
  774.  
  775.       LDY   RHEAD         ;POINTER TO START OF BUFFER
  776.       LDA   (RBUFF),Y     ;FETCH BYTE OUT OF BUFFER INTO '┴' REGISTER
  777.       INC   RHEAD         ;POINT TO NEXT SLOT IN BUFFER
  778.       DEC   RECVCOUNT     ;AND ADD ONE TO COUNT OF BYTES IN BUFFER
  779.  
  780.       CLC                 ;INDICATE THAT WE HAVE A CHARACTER
  781.       RTS                 ;RETURN TO YOUR PROGRAM
  782.  
  783. ╥┼├╓┼═╨╘┘:
  784.       SEC                 ;OR WHATEVER FLAG YOUR PROGRAM USES TO TELL THAT THE
  785.                           ;RECEIVE BUFFER WAS EMPTY
  786.       RTS                 ;AND RETURN
  787.  
  788. ;-----------------------------------------------------------------------------
  789. ;─UMB -- VERY DUMB -- TERMINAL EMULATOR.  ╙IMPLY POLLS THE RECEIVE BUFFER AND
  790. ;THE KEYBOARD AND PUTS RECEIVED DATA TO THE SCREEN AND TYPED DATA TO THE SEND
  791. ;BUFFER (THUS, IT ASSUMES A FULL-DUPLEX, ECHOING LINK).  ╘HERE IS NO
  792. ;╨┼╘╙├╔╔->┴╙├╔╔ CONVERSION, NO CURSOR, NOR ANY OTHER FANCY FEATURES.  ╨RESS
  793. ;╙╘╧╨ TO EXIT.
  794. ;
  795. ;BY ├RAIG ┬RUCE, 1995.
  796.  
  797. ╘┼╥═╔╬┴╠:
  798.       JSR   ╥┼├╓┬┘╘┼      ;SEE IF THERE IS A RECEIVED BYTE IN THE RECV BUFFER
  799.       BCS   ╘┼╥═╘╥┘╙┼╬─   ;IF NOT, CONTINUE
  800.       JSR   $╞╞─2         ;IF RECEIVED BYTE, PRINT IT TO THE SCREEN (├╚╥╧╒╘)
  801. ╘┼╥═╘╥┘╙┼╬─:
  802.       JSR   $╞╞┼4         ;TRY TO GET A CHARACTER FROM THE KEYBOARD (╟┼╘╔╬)
  803.       CMP   #$00          ;WAS THERE A KEYSTROKE AVAILABLE?
  804.       BEQ   ╘┼╥═╔╬┴╠      ;NO--GO BACK TO TOP OF POLLING LOOP
  805.       CMP   #$03          ;CHECK FOR ╙╘╧╨ KEY
  806.       BEQ   ╘┼╥═┼╪╔╘      ;  EXIT IF PRESSED
  807.       JSR   ╙┼╬─┬┘╘┼      ;HAVE CHAR--PUT IT INTO THE TRANSMIT BUFFER AND THEN
  808.       JMP   ╘┼╥═╔╬┴╠      ;  GO BACK TO TOP OF POLLING LOOP
  809. ╘┼╥═┼╪╔╘:
  810.       LDA   #%0000_0010   ;DISABLE TRANSMITTER AND RECEIVER AND ALL INTERRUPTS
  811.       STA   COMMAND
  812.       SEI
  813.       LDA   ╧╠─╓┼├        ;RESTORE THE ╬═╔ VECTOR TO ITS ORIGINAL VALUE
  814.       STA   ╬═╔╬╓
  815.       LDA   ╧╠─╓┼├+1
  816.       STA   ╬═╔╬╓+1
  817.       CLI
  818.       RTS                 ;EXIT
  819.  
  820. ╘╥┴╬╙═╔╘_┬╒╞╞┼╥ = *+0
  821. ╥┼├┼╔╓┼_┬╒╞╞┼╥  = *+256
  822. %%%---8<---CUT-HERE---8<---%%%
  823.  
  824. ------------------------------------------------------------------------------
  825.               ┴╨╨┼╬─╔╪: 6551 ┴├╔┴ ╚┴╥─╫┴╥┼ ╙╨┼├╙ (─┴╘┴ ╙╚┼┼╘)
  826.  
  827.                      ├= ├OMMODORE ╙EMICONDUCTOR ╟ROUP
  828.               A DIVISION OF ├OMMODORE ┬USINESS ═ACHINES, ╔NC.
  829.  950 ╥ITTENHOUSE ╥OAD, ╬ORNSTOWN, ╨┴ 19400 * 215/666-7950 * ╘╫╪ 510-660-4168
  830.                                 (╩ULY 1987)
  831.  
  832.              6551 ┴╙┘╬├╚╥╧╬╧╒╙ ├╧══╒╬╔├┴╘╔╧╬ ╔╬╘┼╥╞┴├┼ ┴─┴╨╘┼╥
  833.  
  834. ├╧╬├┼╨╘:
  835.  
  836. ╘HE 6551 IS AN ┴SYNCHRONOUS ├OMMUNICATION ┴DAPTER (┴├╔┴) INTENDED TO PROVIDE
  837. FOR INTERFACING THE 6500/6800 MICROPROCESSOR FAMILIES TO SERIAL COMMUNICATION
  838. DATA SETS AND MODEMS.  ┴ UNIQUE FEATURE IS THE INCLUSION OF AN ON-CHIP
  839. PROGRAMMABLE BAUD-RATE GENERATOR, WITH A CRYSTAL BEING THE ONLY EXTERNAL
  840. COMPONENT REQUIRED.
  841.  
  842. ╞┼┴╘╒╥┼╙:
  843.  
  844. * ╧N-CHIP BAUD-RATE GENERATOR: 15 PROGRAMMABLE BAUD RATES DERIVED FROM A
  845.   STANDARD STANDARD 1.8432 ═╚Z EXTERNAL CRYSTAL (50 TO 19,200 BAUD) [THESE
  846.   RATES ARE DOUBLED IN THE ╙WIFT╠INK].
  847.  
  848. * ╨ROGRAMMABLE INTERRUPT AND STATUS REGISTER TO SIMPLIFY SOFTWARE DESIGN.
  849.  
  850. * ╙INGLE +5 VOLT POWER SUPPLY.
  851.  
  852. * ╙ERIAL ECHO MODE.
  853.  
  854. * ╞ALSE START BIT DETECTION.
  855.  
  856. * 8-BIT BI-DIRECTIONAL DATA BUS FOR DIRECT COMMUNICATION WITH THE
  857.   MICROPROCESSOR.
  858.  
  859. * ┼XTERNAL 16X CLOCK INPUT FOR NON-STANDARD BAUD RATES (UP TO 125 ╦BAUD).
  860.  
  861. * ╨ROGRAMMABLE: WORD LENGTHS; NUMBER OF STOP BITS; AND PARITY-BIT GENERATION
  862.   AND DETECTION.
  863.  
  864. * ─ATA SET AND MODEM CONTROL SIGNALS PROVIDED.
  865.  
  866. * ╨ARITY: (ODD, EVEN, NONE, MARK, SPACE).
  867.  
  868. * ╞ULL-DUPLEX OR HALF-DUPLEX OPERATION.
  869.  
  870. * 5,6,7 AND 8-BIT TRANSMISSION.
  871.  
  872. * 1-═╚Z, 2-═╚Z, AND 3-═╚Z OPERATION.
  873.  
  874. ╧╥─┼╥ ╬╒═┬┼╥
  875.  
  876. ═╪╙ 6551 ___
  877.  -        ▄
  878.  ▄        +---- ╞REQUENCY RANGE
  879.  ▄                  ╨LAIN = 1 ═╚Z
  880.  ▄                      ┴ = 2 ═╚Z
  881.  ▄                      ┬ = 3 ═╚Z
  882.  ▄
  883.  +----------- ╨ACKAGE ─ESIGNATOR
  884.                      ├ = ├ERAMIC
  885.                      ╨ = ╨LASTIC
  886.  
  887. 6551 ╨╔╬ ├╧╬╞╔╟╒╥┴╘╔╧╬
  888.  
  889.                 +---------------+
  890.           ╟╬─ --▄ 1          28 ▄-- ╥-/╫
  891.           ├╙0 --▄ 2          27 ▄-- O2
  892.          /├╙1 --▄ 3          26 ▄-- /╔╥╤
  893.          /╥┼╙ --▄ 4          25 ▄-- ─┬7
  894.           ╥X├ --▄ 5          24 ▄-- ─┬6
  895.         ╪╘┴╠1 --▄ 6          23 ▄-- ─┬5
  896.         ╪╘┴╠2 --▄ 7          22 ▄-- ─┬4
  897.          /╥╘╙ --▄ 8          21 ▄-- ─┬3
  898.          /├╘╙ --▄ 9          20 ▄-- ─┬2
  899.           ╘X─ --▄ 10         19 ▄-- ─┬1
  900.          /─╘╥ --▄ 11         18 ▄-- ─┬0
  901.           ╥X─ --▄ 12         17 ▄-- /─╙╥
  902.           ╥╙0 --▄ 13         16 ▄-- /─├─
  903.           ╥╙1 --▄ 14         15 ▄-- ╓CC
  904.                 +---------------+
  905.  
  906. ┬╠╧├╦ ─╔┴╟╥┴═                                        +----------+
  907.                                                      ▄ ╘╥┴╬╙═╔╘ ▄
  908.                                                      ▄ ├╧╬╘╥╧╠  ▄<------- ├╘╙
  909.                                                      +----------+
  910.                                                            ▄
  911.                                                            V
  912.                                +----------+          +----------+
  913.                                ▄ ╘╥┴╬╙═╔╘ ▄          ▄ ╘╥┴╬╙═╔╘ ▄
  914.                          /▄===>▄   ─┴╘┴   ▄=========>▄  ╙╚╔╞╘   ▄-------> ╘X─
  915.                          ▄▄    ▄ ╥┼╟╔╙╘┼╥ ▄          ▄ ╥┼╟╔╙╘┼╥ ▄
  916.                          ▄▄    +----------+          +----------+
  917.           +---------+    ▄▄
  918.    O2 --->▄         ▄    ▄▄    +----------+          +----------+
  919.  ╥-/╫ --->▄  ╙┼╠┼├╘ ▄    ▄▄====▄  ╙╘┴╘╒╙  ▄          ▄ ╔╬╘┼╥╥╒╨╘▄-------> /╔╥╤
  920.   ├╙0 --->▄   ┴╬─   ▄    ▄▄    ▄ ╥┼╟╔╙╘┼╥ ▄<-------->▄   ╠╧╟╔├  ▄<------- /─├─
  921.  /├╙1 --->▄ ├╧╬╘╥╧╠ ▄    ▄▄    +----------+          +----------+<------- /─╙╥
  922.   ╥╙0 --->▄  ╠╧╟╔├  ▄    ▄▄
  923.   ╥╙1 --->▄         ▄    ▄▄    +----------+          +----------+
  924.  /╥┼╙ --->▄         ▄    ▄▄===>▄ ├╧╬╘╥╧╠  ▄          ▄ ┬┴╒─-╥┴╘┼▄<------> ╥X├
  925.           +---------+    ▄▄    ▄ ╥┼╟╔╙╘┼╥ ▄          ▄ ╟┼╬┼╥┴╘╧╥▄<------- ╪╘┴╠1
  926.                          ▄▄    +----------+          +----------+<------- ╪╘┴╠2
  927.                          ▄▄
  928.           +---------+    ▄▄    +----------+          +----------+
  929.   ─┬0 <-->▄  ─┴╘┴-  ▄    ▄▄    ▄  ╥┼├┼╔╓┼ ▄          ▄  ╥┼├┼╔╓┼ ▄
  930.   ...     ▄   ┬╒╙   ▄<===▄▄====▄   ─┴╘┴   ▄<=========▄   ╙╚╔╞╘  ▄<---+--- ╥X─
  931.   ─┬7 <-->▄ ┬╒╞╞┼╥╙ ▄    ▄▄    ▄ ╥┼╟╔╙╘┼╥ ▄          ▄ ╥┼╟╔╙╘┼╥ ▄    ▄
  932.           +---------+    ▄▄    +----------+          +-----.----+    ▄
  933.                          ▄▄                                ▄         ▄
  934.                          ▄▄    +----------+          +----------+    ▄
  935.    ╠┼╟┼╬─:               \▄===>▄ ├╧══┴╬─  ▄          ▄  ╥┼├┼╔╓┼ ▄    ▄
  936.                                ▄ ╥┼╟╔╙╘┼╥ ▄          ▄  ├╧╬╘╥╧╠ ▄<---+
  937.    ===> : 8-BIT LINE           +----------+          +----------+
  938.                                   ▄    ▄
  939.    ---> : 1-BIT LINE              ▄    +--------------------------------> /─╘╥
  940.                                   +-------------------------------------> /╥╘╙
  941.  
  942. ═┴╪╔═╒═ ╥┴╘╔╬╟╙
  943.  
  944. <NOT INCLUDED HERE>
  945.  
  946. ┼╠┼├╘╥╔├┴╠ ├╚┴╥┴├╘┼╥╔╙╘╔├╙
  947.  
  948. <NOT INCLUDED HERE>
  949.  
  950. ╨╧╫┼╥ ─╔╙╙╔╨┴╘╔╧╬ VS ╘┼═╨┼╥┴╘╒╥┼
  951.  
  952. <NOT INCLUDED HERE>
  953.  
  954. ╘╔═╔╬╟ ├╚┴╥┴├╘┼╥╔╙╘╔├╙
  955.  
  956. <NOT INCLUDED HERE>
  957.  
  958. ╔╬╘┼╥╞┴├┼ ╙╔╟╬┴╠ ─┼╙├╥╔╨╘╔╧╬
  959.  
  960. /╥┼╙ (╥ESET)
  961.  
  962. ─URING SYSTEM INITIALIZATION A LOW ON THE /╥┼╙ INPUT WILL CAUSE INTERNAL
  963. REGISTERS TO BE CLEARED.
  964.  
  965. O2 (╔NPUT ├LOCK)
  966.  
  967. ╘HE INPUT CLOCK IS THE SYSTEM O2 CLOCK AND IS USED TO TRIGGER ALL DATA
  968. TRANSFERS BETWEEN THE SYSTEM MICROPROCESSOR AND THE 6551.
  969.  
  970. ╥-/╫ (╥EAD/╫RITE)
  971.  
  972. ╘HE ╥-/╫ IS GENERATED BY THE MICROPROCESSOR AND IS USED TO CONTROL THE
  973. DIRECTION OF DATA TRANSFERS.  ┴ HIGH ON THE ╥-/╫ PIN ALLOWS THE PROCESSOR
  974. TO READ THE DATA SUPPLIED BY THE 6551.  ┴ LOW ON THE ╥-/╫ PIN ALLOWS A WRITE
  975. TO THE 6551.
  976.  
  977. /╔╥╤ (╔NTERRUPT ╥EQUEST)
  978.  
  979. ╘HE /╔╥╤ PIN IS AN INTERRUPT SIGNAL FROM THE INTERRUPT-CONTROL LOGIC.  ╔T IS
  980. AN OPEN DRAIN OUTPUT, PERMITTING SEVERAL DEVICES TO BE CONNECTED TO THE COMMON
  981. /╔╥╤ MICROPROCESSOR INPUT.  ╬ORMALLY A HIGH LEVEL, /╔╥╤ GOES LOW WHEN AN
  982. INTERRUPT OCCURS.
  983.  
  984. ─┬0--─┬7 (─ATA ┬US)
  985.  
  986. ╘HE ─┬0--─┬7 PINS ARE THE EIGHT DATA LINES USED FOR TRANSFER OF DATA BETWEEN
  987. THE PROCESSOR AND THE 6551.  ╘HESE LINES ARE BI-DIRECTIONAL AND ARE NORMALLY
  988. HIGH-IMPEDANCE EXCEPT DURING ╥EAD CYCLES WHEN SELECTED.
  989.  
  990. ├╙0, /├╙1 (├HIP ╙ELECTS)
  991.  
  992. ╘HE TWO CHIP-SELECT INPUTS ARE NORMALLY CONNECTED TO THE PROCESSOR-ADDRESS
  993. LINES EITHER DIRECTLY OR THROUGH DECODERS.  ╘HE 6551 IS SELECTED WHEN ├╙0 IS
  994. HIGH AND /├╙1 IS LOW.
  995.  
  996. ╥╙0, ╥╙1 (╥EGISTER ╙ELECTS)
  997.  
  998. ╘HE TWO REGISTER-SELECT LINES ARE NORMALLY CONNECTED TO THE PROCESSOR-ADDRESS
  999. LINES TO ALLOW THE PROCESSOR TO SELECT THE VARIOUS 6551 INTERNAL REGISTERS.
  1000. ╘HE FOLLOWING TABLE INDICATES THE INTERNAL REGISTER-SELECT CODING:
  1001.  
  1002. ╥╙1   ╥╙0   ╫╥╔╘┼                     ╥┼┴─                    ╙╠-┴DDR
  1003. ---   ---   ----------------------    ---------------------   -------
  1004.   0     0   ╘RANSMIT ─ATA ╥EGISTER    ╥ECEIVE ─ATA ╥EGISTER     $─┼00
  1005.   0     1   ╨ROGRAMMED ╥ESET*         ╙TATUS ╥EGISTER           $─┼01
  1006.   1     0   ├OMMAND ╥EGISTER          ├OMMAND ╥EGISTER          $─┼02
  1007.   1     1   ├ONTROL ╥EGISTER          ├ONTROL ╥EGISTER          $─┼03
  1008.  
  1009.                 * FOR PROGRAMMED RESET, DATA IS "DON'T CARE".
  1010.  
  1011. ╘HE TABLE SHOWS THAT ONLY THE ├OMMAND AND ├ONTROL REGISTERS ARE READ/WRITE.
  1012. ╘HE ╨ROGRAMMED ╥ESET OPERATION DOES NOT CAUSE ANY DATA TRANSFER, BUT IS USED
  1013. TO CLEAR THE 6551 REGISTERS.  ╘HE ╨ROGRAMMED ╥ESET IS SLIGHTLY DIFFERENT FROM
  1014. THE ╚ARDWARE ╥ESET (/╥┼╙) AND THESE DIFFERENCES ARE DESCRIBED IN THE
  1015. INDIVIDUAL REGISTER DEFINITIONS.
  1016.  
  1017. ┴├╔┴/═╧─┼═ ╔╬╘┼╥╞┴├┼ ╙╔╟╬┴╠ ─┼╙├╥╔╨╘╔╧╬
  1018.  
  1019. ╪╘┴╠1, ╪╘┴╠2 (├RYSTAL ╨INS)
  1020.  
  1021. ╘HESE PINS ARE NORMALLY DIRECTLY CONNECTED TO THE EXTERNAL CRYSTAL (1.8432
  1022. ═╚Z) USED TO DERIVE THE VARIOUS BAUD RATES.  ┴LTERNATIVELY, AN EXTERNALLY
  1023. GENERATED CLOCK MAY BE USED TO DRIVE THE ╪╘┴╠1 PIN, IN WHICH CASE THE ╪╘┴╠2
  1024. PIN MUST FLOAT.  ╪╘┴╠1 IS THE INPUT PIN FOR THE TRANSMIT CLOCK.
  1025.  
  1026. ╘X─ (╘RANSMIT ─ATA)
  1027.  
  1028. ╘HE ╘X─ OUTPUT LINE IS USED TO TRANSFER SERIAL ╬╥┌ (NON-RETURN-TO-ZERO) DATA
  1029. TO THE MODEM.  ╘HE ╠╙┬ (LEAST-SIGNIFICANT BIT) OF THE ╘RANSMIT ─ATA ╥EGISTER
  1030. IS THE FIRST DATA BIT TRANSMITTED AND THE REATE OF DATA TRANSMISSION IS
  1031. DETERMINED BY THE BAUD RATE SELECTED.
  1032.  
  1033. ╥X─ (╥ECEIVE ─ATA)
  1034.  
  1035. ╘HE ╥X─ INPUT LINE IS USED TO TRANSFER SERIAL ╬╥┌ DATA INTO THE ┴├╔┴ FROM THE
  1036. MODEM, ╠╙┬ FIRST.  ╘HE RECEIVER DATA RATE IS EITHER THE PROGRAMMED BAUD RATE
  1037. OR THE RATE OF AN EXTERNALLY GENERATED RECEIVER CLOCK.  ╘HIS SELECTION IS MADE
  1038. BY PROGRAMMING THE ├ONTROL ╥EGISTER.
  1039.  
  1040. ╥X├ (╥ECEIVE ├LOCK)
  1041.  
  1042. ╘HE ╥X├ IS A BI-DIRECTIONAL PIN WHICH SERVES AS EITHER THE RECEIVER 16X CLOCK
  1043. INPUT OR THE RECEIVER 16X CLOCK OUTPUT.  ╘HE LATTER MODE RESULTS IF THE
  1044. INTERNAL BAUD RATE GENERATOR IS SELECTED FOR RECEIVER DATA CLOCKING.
  1045.  
  1046. /╥╘╙ (╥EQUEST TO ╙END)
  1047.  
  1048. ╘HE /╥╘╙ OUTPUT PIN IS USED TO CONTROL THE MODEM FROM THE PROCESSOR.  ╘HE
  1049. STATE OF THE /╥╘╙ PIN IS DETERMINED BY THE CONTENTS OF THE ├OMMAND ╥EGISTER.
  1050.  
  1051. /├╘╙ (├LEAR TO ╙END)
  1052.  
  1053. ╘HE /├╘╙ INPUT PIN IS USED TO CONTROL THE TRANSMITTER OPERATION.  ╘HE ENABLE
  1054. STATE IS WITH /├╘╙ LOW.  ╘HE TRANSMITTER IS AUTOMATICALLY DISABLED IF /├╘╙ IS
  1055. HIGH.
  1056.  
  1057. /─╘╥ (─ATA ╘ERMINAL ╥EADY)
  1058.  
  1059. ╘HE OUTPUT PIN IS USED TO INDICATE THE STATUS OF THE 6551 TO THE MODEM.  ┴ LOW
  1060. OF /─╘╥ INDICATES THE 6551 IS ENABLED AND A HIGH INDICATES IT IS DISABLED.
  1061. ╘HE PROCESSOR CONTROLS THIS PIN VIA BIT 0 OF THE ├OMMAND ╥EGISTER.
  1062.  
  1063. /─╙╥ (─ATA ╙ET ╥EADY)
  1064.  
  1065. ╘HE /─╙╥ INPUT PIN IS USED TO INDICATE TO THE 6551 THE STATUS OF THE MODEM.  ┴
  1066. LOW INDICATES THE "READY" STATE AND A HIGH, "NOT-READY".  /─╙╥ IS A HIGH-
  1067. IMPEDANCE INPUT AND MUST NOT BE A NO-CONNECT.  ╔F UNUSED, IT SHOULD BE DRIVEN
  1068. HIGH OR LOW, BUT NOT SWITCHED.
  1069.  
  1070. ╬OTE: ╔F ├OMMAND ╥EGISTER ┬IT #0 = 1 AND A CHANGE OF STATE ON /─╙╥ OCCURS,
  1071. /╔╥╤ WILL BE SET AND ╙TATUS ╥EGISTER ┬IT #[5] WILL REFLECT THE NEW LEVEL.  ╘HE
  1072. STATE OF /─╙╥ DOES NOT AFFECT ╘RANSMITTER OPERATION [BUT MUST BE LOW FOR THE
  1073. ╥ECEIVER TO OPERATE].  [╘HIS STATEMENT REFLECTS THE ╙WIFT╠INK IMPLEMENTATION].
  1074.  
  1075. /─├─ (─ATA ├ARRIER ─ETECT)
  1076.  
  1077. ╘HE /─├─ INPUT PIN IS USED TO INDICATE TO THE 6551 THE STATUS OF THE CARRIER-
  1078. DETECT OUTPUT OF THE MODEM.  ┴ LOW INDICATES THAT THE MODEM CARRIER SIGNAL IS
  1079. PRESENT AND A HIGH, THAT IT IS NOT.  /─├─, LIKE /─╙╥, IS A HIGH-IMPEDANCE
  1080. INPUT AND MUST NOT BE A NO-CONNECT.
  1081.  
  1082. ╬OTE: ╔F ├OMMAND ╥EGISTER ┬IT #0 = 1 AND A CHANGE OF STATE ON /─╙╥ OCCURS,
  1083. /╔╥╤ WILL BE SET AND ╙TATUS ╥EGISTER ┬IT #[6] WILL REFLECT THE NEW LEVEL.  ╘HE
  1084. STATE OF /─├─ DOES NOT AFFECT EITHER ╘RANSMITTER OR ╥ECEIVER OPERATION.
  1085.  
  1086. ╔╬╘┼╥╬┴╠ ╧╥╟┴╬╔┌┴╘╔╧╬
  1087.  
  1088. <NOT INCLUDED HERE>
  1089.  
  1090. ╘╥┴╬╙═╔╘ ┴╬─ ╥┼├┼╔╓┼ ─┴╘┴ ╥┼╟╔╙╘┼╥╙ (╙╠-┴DDR: $─┼00 / 56832)
  1091.  
  1092. ╘HESE REGISTERS ARE USED AS TEMPORARY DATA STORAGE FOR THE 6551 ╘RANSMIT AND
  1093. ╥ECEIVE CIRCUITS.  ╘HE ╘RANSMIT ─ATA ╥EGISTER IS CHARACTERIZED AS FOLLOWS:
  1094.  
  1095. * ┬IT 0 IS THE LEADING BIT TO BE TRANSMITTED.
  1096.  
  1097. * ╒NUSED DATA BITS ARE THE HIGH-ORDER BITS AND ARE "DON'T CARE" FOR
  1098.   TRANSMISSION.
  1099.  
  1100. ╘HE ╥ECEIVE ─ATA ╥EGISTER IS CHARACTERIZED IN A SIMILAR FASHION:
  1101.  
  1102. * ┬IT 0 IS THE LEADING BIT RECEIVED.
  1103.  
  1104. * ╒NUSED DATA BITS ARE THE HIGH-ORDER BITS AND ARE "0" FOR THE RECEIVER.
  1105.  
  1106. * ╨ARITY BITS ARE NOT CONTAINED IN THE ╥ECEIVE ─ATA ╥EGISTER, BUT ARE STRIPPED
  1107.   OFF AFTER BEING USED FOR EXTERNAL PARITY CHECKING.  ╨ARITY AND ALL UNUSED
  1108.   HIGH-ORDER BITS ARE "0".
  1109.  
  1110.            ╘RANSMIT / ╥ECEIVE ─ATA ╥EGISTER
  1111.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1112.   ▄  7  ▄  6  ▄  5  ▄  4  ▄  3  ▄  2  ▄  1  ▄  0  ▄
  1113.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1114.   ▄                     DATA                      ▄
  1115.  
  1116.   ╘HE FOLLOWING FIGURE ILLUSTRATES A SINGLE TRANSMITTED OR RECEIVED DATA
  1117.   WORD, FOR THE EXAMPLE OF 8 DATA BITS, PARITY, AND 1 STOP BIT:
  1118.  
  1119.   "═┴╥╦"____    ________________________________________________________"═┴╥╦"
  1120.            ▄    ▄ 0  ▄ 1  ▄ 2  ▄ 3  ▄ 4  ▄ 5  ▄ 6  ▄ 7  ▄ 8  ▄ ╨  ▄ ╙  .
  1121.            ▄____▄____▄____▄____▄____▄____▄____▄____▄____▄____▄____▄
  1122.             START                                            PARITY  STOP
  1123.              BIT                ...DATA BITS...               BIT     BIT
  1124.  
  1125.  
  1126. ╙╘┴╘╒╙ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼01 / 56833)
  1127.  
  1128. ╘HE ╙TATUS ╥EGISTER IS USED TO INDICATE TO THE PROCESSOR THE STATUS OF VARIOUS
  1129. 6551 FUNCTIONS AND IS OUTLINED HERE:
  1130.  
  1131.                    ├OMMAND ╥EGISTER
  1132.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1133.   ▄  7  ▄  6  ▄  5  ▄  4  ▄  3  ▄  2  ▄  1  ▄  0  ▄
  1134.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1135.   ▄ IRQ ▄ DCD ▄ DSR ▄ TXR ▄ RXR ▄ OVR ▄ FE  ▄ PE  ▄
  1136.  
  1137.   +---+
  1138.   ▄ 7 ▄   /╔╥╤*** : CLEARED BY READING STATUS REGISTER
  1139.   +---+   --------------------------------------------
  1140.     0     ╬O INTERRUPT
  1141.     1     ╔NTERRUPT
  1142.  
  1143.   +---+
  1144.   ▄ 6 ▄   /─├─ : NON-RESETABLE, INDICATES /─├─ STATUS
  1145.   +---+   --------------------------------------------
  1146.     0     /─├─ LOW
  1147.     1     /─├─ HIGH
  1148.  
  1149.   +---+
  1150.   ▄ 5 ▄   /─╙╥ : NON-RESETABLE, INDICATES /─╙╥ STATUS
  1151.   +---+   --------------------------------------------
  1152.     0     /─╙╥ LOW
  1153.     1     /─╙╥ HIGH
  1154.  
  1155.   +---+
  1156.   ▄ 4 ▄   ╘RANSMIT ─ATA ╥EGISTER ┼MPTY: ├LEARED BY WRITE TO ╘X ─ATA REG
  1157.   +---+   -------------------------------------------------------------
  1158.     0     ╬OT EMPTY
  1159.     1     ┼MPTY
  1160.  
  1161.   +---+
  1162.   ▄ 3 ▄   ╥ECEIVE ─ATA ╥EGISTER ╞ULL: ├LEARED BY READ FROM ╥X ─ATA REG
  1163.   +---+   -------------------------------------------------------------
  1164.     0     ╬OT FULL
  1165.     1     ╞ULL
  1166.  
  1167.   +---+
  1168.   ▄ 2 ▄   ╧VERRUN*: ╙ELF-CLEARING**
  1169.   +---+   -------------------------
  1170.     0     ╬O ERROR
  1171.     1     ┼RROR
  1172.  
  1173.   +---+
  1174.   ▄ 1 ▄   ╞RAMING ┼RROR*: ╙ELF-CLEARING**
  1175.   +---+   -------------------------------
  1176.     0     ╬O ERROR
  1177.     1     ┼RROR
  1178.  
  1179.   +---+
  1180.   ▄ 0 ▄   ╨ARITY ┼RROR*: ╙ELF-CLEARING**
  1181.   +---+   ------------------------------
  1182.     0     ╬O ERROR
  1183.     1     ┼RROR
  1184.  
  1185.   ╬OTES:   * ╬O INTERRUPT GENERATED FOR THESE CONDITIONS
  1186.           ** ├LEARED AUTOMATICALLY AFTER A READ OF ╥─╥ AND THE NEXT ERROR-
  1187.                FREE RECEIPT OF DATA
  1188.          *** ╥EADING STATUS REG. WILL CLEAR THE /╔╥╤ BIT EXCEPT WHEN
  1189.                TRANSMIT INTR. ENABLED
  1190.  
  1191.     7   6   5   4   3   2   1   0
  1192.   +---+---+---+---+---+---+---+---+
  1193.   ▄ 0 ▄ X ▄ X ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄  ┴FTER ╚ARDWARE RESET
  1194.   +---+---+---+---+---+---+---+---+
  1195.   ▄ X ▄ X ▄ X ▄ X ▄ X ▄ 0 ▄ X ▄ X ▄  ┴FTER ╙OFTWARE RESET
  1196.   +---+---+---+---+---+---+---+---+
  1197.  
  1198.  
  1199. ├╧══┴╬─ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼02 / 56834)
  1200.  
  1201. ╘HE ├OMMAND ╥EGISTER IS USED TO CONTROL SPECIFIC ╘RANSMIT/╥ECEIVE FUNCTIONS
  1202. AND IS SHOWN HERE:
  1203.  
  1204.                    ├OMMAND ╥EGISTER
  1205.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1206.   ▄  7  ▄  6  ▄  5  ▄  4  ▄  3  ▄  2  ▄  1  ▄  0  ▄
  1207.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1208.   ▄     PARITY      ▄ ECHO▄  TX CTRL  ▄ RXI ▄ DTR ▄
  1209.  
  1210.   +---+---+---+
  1211.   ▄ 7 ▄ 6 ▄ 5 ▄   ╨┴╥╔╘┘ ├╚┼├╦ ├╧╬╘╥╧╠╙
  1212.   +---+---+---+   ----------------------
  1213.     X   X   0     PARITY DISABLED--NO PARITY BIT GENERATED OR RECEIVED
  1214.     0   0   1     ODD PARITY RECEIVER AND TRANSMITTER
  1215.     0   1   1     EVEN PARITY RECEIVER AND TRANSMITTER
  1216.     1   0   1     MARK PARITY TRANSMITTED, PARITY CHECK DISABLED
  1217.     1   1   1     SPACE PARITY TRANSMITTED, PARITY CHECK DISABLED
  1218.  
  1219.   +---+
  1220.   ▄ 4 ▄   ╬╧╥═┴╠/┼├╚╧ ═╧─┼ ╞╧╥ ╥┼├┼╔╓┼╥
  1221.   +---+   ------------------------------
  1222.     0     ╬ORMAL
  1223.     1     ┼CHO (BITS 2 AND 3 MUST BE "0")
  1224.  
  1225.   +---+---+
  1226.   ▄ 3 ▄ 2 ▄   ╘X ╔╬╘┼╥╥╒╨╘    ╥╘╙ ╠┼╓┼╠    ╘╥┴╬╙═╔╘╘┼╥
  1227.   +---+---+   ------------    ---------    ------------
  1228.     0   0       ─ISABLED         ╚IGH           ╧FF
  1229.     0   1       ┼NABLED          ╠OW            ╧N
  1230.     1   0       ─ISABLED         ╠OW            ╧N
  1231.     1   1       ─ISABLED         ╠OW       ╘RANSMIT ┬╥╦
  1232.  
  1233.   +---+
  1234.   ▄ 1 ▄   ╥┼├┼╔╓┼ ╔╬╘┼╥╥╒╨╘ ┼╬┴┬╠┼
  1235.   +---+   -------------------------
  1236.     0     /╔╥╤ INTERRUPT ┼NABLED FROM BIT 3 OF ╙TATUS ╥EGISTER
  1237.     1     /╔╥╤ INTERRUPT ─ISABLED
  1238.  
  1239.   +---+
  1240.   ▄ 0 ▄   ─┴╘┴ ╘┼╥═╔╬┴╠ ╥┼┴─┘
  1241.   +---+   --------------------
  1242.     0     ─ISABLE ╥ECEIVER AND ALL INTERRUPTS (/─╘╥ HIGH)
  1243.     1     ┼NABLE ╥ECEIVER AND ALL INTERRUPTS  (/─╘╥ LOW)
  1244.  
  1245.     7   6   5   4   3   2   1   0
  1246.   +---+---+---+---+---+---+---+---+
  1247.   ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄  ┴FTER ╚ARDWARE RESET
  1248.   +---+---+---+---+---+---+---+---+
  1249.   ▄ X ▄ X ▄ X ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄  ┴FTER ╙OFTWARE RESET
  1250.   +---+---+---+---+---+---+---+---+
  1251.  
  1252.  
  1253. ├╧╬╘╥╧╠ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼03 / 56835 / CPM: 0001XXXX)
  1254.  
  1255. ╘HE ├ONTROL ╥EGISTER IS USED TO SELECT THE DESIRED MODE FOR THE 6551.  ╘HE
  1256. WORD LENGTH, NUMBER OF STOP BITS, AND CLOCK CONTROLS ARE ALL DETERMINED
  1257. BY THE ├ONTROL ╥EGISTER, WHICH IS SHOWN HERE:
  1258.  
  1259.                    ├ONTROL ╥EGISTER
  1260.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1261.   ▄  7  ▄  6  ▄  5  ▄  4  ▄  3  ▄  2  ▄  1  ▄  0  ▄
  1262.   +-----+-----+-----+-----+-----+-----+-----+-----+
  1263.   ▄STOPS▄  WORD LEN ▄ SRC ▄       BAUD RATE       ▄
  1264.  
  1265.   +---+
  1266.   ▄ 7 ▄   ╙╘╧╨ ┬╔╘╙
  1267.   +---+   ----------
  1268.     0     1 STOP BIT
  1269.     1     2 STOP BITS
  1270.     1     1 STOP BIT IF WORD LENGTH== 8 BITS AND PARITY
  1271.               THIS ALLOWS FOR 9-BIT TRANSMISSION (8 DATA BITS PLUS PARITY)
  1272.     1     1.5 STOP BITS IF WORD LENGTH== 5 BITS AND NO PARITY
  1273.  
  1274.   +---+---+
  1275.   ▄ 6 ▄ 5 ▄   ╫╧╥─ ╠┼╬╟╘╚
  1276.   +---+---+   ------------
  1277.     0   0     8 BITS
  1278.     0   1     7 BITS
  1279.     1   0     6 BITS
  1280.     1   1     5 BITS
  1281.  
  1282.   +---+
  1283.   ▄ 4 ▄   ╥┼├┼╔╓┼╥ ├╠╧├╦ ╙╧╒╥├┼
  1284.   +---+   ----------
  1285.     0     EXTERNAL RECEIVER CLOCK
  1286.     1     BAUD RATE GENERATOR
  1287.  
  1288.   +---+---+---+---+
  1289.   ▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄   ┬┴╒─ ╥┴╘┼ ╟┼╬┼╥┴╘╧╥
  1290.   +---+---+---+---+   --------------------
  1291.     0   0   0   0     16X EXTERNAL CLOCK
  1292.     0   0   0   1     100 BAUD
  1293.     0   0   1   0     150 BAUD
  1294.     0   0   1   1     219.84 BAUD
  1295.     0   1   0   0     269.16 BAUD
  1296.     0   1   0   1     300 BAUD
  1297.     0   1   1   0     600 BAUD
  1298.     0   1   1   1     1200 BAUD
  1299.     1   0   0   0     2400 BAUD
  1300.     1   0   0   1     3600 BAUD
  1301.     1   0   1   0     4800 BAUD
  1302.     1   0   1   1     7200 BAUD
  1303.     1   1   0   0     9600 BAUD
  1304.     1   1   0   1     14400 BAUD
  1305.     1   1   1   0     19200 BAUD
  1306.     1   1   1   1     38400 BAUD
  1307.  
  1308.     7   6   5   4   3   2   1   0
  1309.   +---+---+---+---+---+---+---+---+
  1310.   ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄  ┴FTER ╚ARDWARE RESET
  1311.   +---+---+---+---+---+---+---+---+
  1312.   ▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄  ┴FTER ╙OFTWARE RESET
  1313.   +---+---+---+---+---+---+---+---+
  1314.  
  1315. ========================================================================
  1316. ─ESIGN AND ╔MPLEMENTATION OF A ╙IMPLE/┼FFICIENT ╒PLOAD/─OWNLOAD ╨ROTOCOL
  1317. BY ├RAIG ┬RUCE  <CSBRUCE@CCNGA.UWATERLOO.CA>
  1318.  
  1319. 1. ╔╬╘╥╧─╒├╘╔╧╬
  1320.  
  1321. ╔F YOU USE YOUR ├OMMODORE FOR TELECOMMUNICATIONS, THEN YOU ARE BASICALLY
  1322. INTERESTED IN TWO THINGS: USING YOUR ├= TO EMULATE A TERMINAL FOR INTERACTIVE
  1323. STUFF, AND USING MODEM-FILE-TRANSFER PROTOCOLS TO UPLOAD AND DOWNLOAD FILES
  1324. FROM AND TO YOUR ├OMMODORE.
  1325.  
  1326. ╘HIS DOCUMENT DESCRIBES A CUSTOM UPLOAD/DOWNLOAD PROTOCOL THAT WAS DESIGNED
  1327. FOR USE WITH THE ┴├┼-128/64 SYSTEM AND IS FREELY AVAILABLE TO ANYONE WHO WANTS
  1328. IT (WELL, WHEN ╔ FINISH WITH THE ╥ELEASE #14 OF ┴├┼).  ╫HILE THIS PROTOCOL
  1329. NON-STANDARD, IT BLOWS THE DOORS OFF OF ALL OTHER PROTOCOLS AVAILABLE FOR
  1330. ├OMMODORE COMPUTERS, EVEN THOUGH IT USES A SIMPLE "STOP-AND-WAIT"
  1331. ACKNOWLEDGEMENT SCHEME.  ╘HERE ARE TWO REASONS FOR ITS SPEED: THE FAST DEVICE
  1332. DRIVERS AVAILABLE WITH ┴├┼, AND ITS LARGE PACKET SIZE, UP TO ABOUT 18╦
  1333. (ALTHOUGH THIS COULD BE SIGNIFICANTLY LARGER IS ┴├┼'S MEMORY USAGE WERE
  1334. REORGANIZED).
  1335.  
  1336. ╘HE NAME OF THE PROTOCOL IS "├RAIG'S ╞ILE E╪CHANGE ╨ROTOCOL", OR JUST "╞╪" FOR
  1337. SHORT.  ╔T IS "FILE EXCHANGE" RATHER THAN "UPLOAD" OR "DOWNLOAD" BECAUSE YOU
  1338. WILL USE THE SAME ACTIVATION OF THE PROGRAM TO BOTH UPLOAD AND DOWNLOAD ALL OF
  1339. THE FILES YOU NAME.
  1340.  
  1341. 2. ╒╙┴╟┼
  1342.  
  1343. ╘HE CURRENT IMPLEMENTATION OF ╞╪ CONSISTS OF A "CLIENT" PROGRAM FOR YOU TO RUN
  1344. ON YOUR ├OMMODORE COMPUTER AND A "SERVER" PROGRAM THAT YOU RUN ON YOUR ╒NIX
  1345. HOST.  ╘HERE IS CURRENTLY NO SERVER PROGRAM FOR ANY OTHER PLATFORM, BUT THE
  1346. NECESSARY CHANGES TO THE ├-LANGUAGE PROGRAM WOULDN'T BE TOO HARD.  ╘HE CLIENT
  1347. PROGRAM IS WRITTEN IN 6502 ASSEMBLER, OF COURSE (FOR THE ┴├┼-ASSEMBLER TO BE
  1348. SPECIFIC).
  1349.  
  1350. ╞╪ IS AN EXTERNAL PROGRAM FROM THE TERMINAL PROGRAM, SO (FOR NOW) TO ACTIVATE
  1351. ╞╪, YOU HAVE TO EXIT FROM THE TERMINAL PROGRAM AND ENTER THE ╞╪ COMMAND LINE,
  1352. EXCHANGE THE FILES, AND THEN RE-ENTER THE TERMINAL PROGRAM FROM THE COMMAND
  1353. LINE.
  1354.  
  1355. ╫HEN YOU RUN ╞╪, YOU WILL ACTIVATE THE ╙ERVER PROGRAM FIRST ON YOUR ╒NIX HOST
  1356. AND THEN EXIT THE TERMINAL PROGRAM AND RUN THE ├LIENT PROGRAM ON YOUR
  1357. ├OMMODORE.  ┘OU RUN THE COMMAND "FX" ON BOTH THE CLIENT AND SERVER MACHINES,
  1358. WHICH MAY BE A LITTLE CONFUSING (BUT ╔ THINK YOU'LL GET USED TO IT), AND NAME
  1359. THE FILES THAT YOU WANT TO HAVE TRANSFERRED AS ARGUMENTS TO THE COMMAND ON THE
  1360. MACHINE THAT YOU WANT TO TRANSFER THE FILES ╞╥╧═.  ╘HE USAGE OF THE "FX"
  1361. COMMAND IS AS FOLLOWS:
  1362.  
  1363. FX [-DLV╓7] [-M MAXIMUMS] [-F ARGFILE] [[-B] BINFILE ...] [-T TEXTFILE ...]
  1364.  
  1365. -D = DEBUG MODE
  1366. -L = WRITE TO LOG FILE ("FX.LOG")
  1367. -V = VERBOSE LOG/DEBUG MODE
  1368. -╓ = EXTREMELY VERBOSE LOG/DEBUG MODE
  1369. -7 = USE SEVEN-BIT ENCODING
  1370. -M = SET MAXIMUM PACKET SIZES; MAXIMUMS = ULBIN/ULTXT/DLBIN/DLTXT (BYTES)
  1371. -F = TAKE ARGUMENTS ONE-PER-LINE FROM GIVEN ARGFILE
  1372. -B = BINARY FILES PREFIX
  1373. -T = TEXT FILES PREFIX
  1374. -HELP = HELP
  1375.  
  1376. WELL, FOR THE SERVER, ANYWAY.  ╘HE CLIENT PROGRAM DOESN'T HAVE THE MORE
  1377. EXOTIC OPTIONS.  ╘HE "-D", "-L", "-V", AND "-╓" OPTIONS ARE AVAILABLE ONLY
  1378. ON THE ╙ERVER PROGRAM, AND ARE FOR DEBUGGING PURPOSES ONLY.
  1379.  
  1380. ╘HE "-7" OPTION TELLS THE PROTOCOL TO USE ONLY 7-BIT DATA.  ╔.E., IT TELLS IT
  1381. TO NOT USE THE 8TH BIT POSITION IN THE DATA IS TRANSMITTED.  ╘HIS IS USEFUL IF
  1382. YOU ARE FORCED INTO THE HUMILIATION OF ONLY BEING ABLE TO USE A 7-BIT CHANNEL
  1383. TO YOUR ╒NIX HOST.  ┘OU NEED ONLY NEED TO GIVE THIS OPTION ON EITHER THE
  1384. CLIENT OR THE HOST COMMAND LINE AND THE OTHER SIDE WILL BE INFORMED.  ╔T MAY
  1385. BE USEFUL TO CREATE AN ALIAS FOR THIS COMMAND WITH ALL OF YOUR OPTIONS SET TO
  1386. WHAT YOU WANT THEM TO BE.
  1387.  
  1388. ╘HE PROTOCOL HAS THE CAPACITY TO USE DIFFERENT PACKET SIZES FOR FOUR TYPES OF
  1389. FILE-TRANSFER SITUATIONS: UPLOADING BINARY DATA, UPLOADING TEXT, DOWNLOADING
  1390. BINARY DATA, AND DOWNLOADING TEXT.  ╘HESE ARE USEFUL DISTINCTIONS, SINCE YOUR
  1391. HOST MAY OR MAY NOT BE ABLE TO HANDLE THE LARGER PACKET SIZES WITHOUT LOSING
  1392. BYTES (YOUR ├OMMODORE, OF COURSE, CAN HANDLE THE LARGER PACKET SIZES WITH NO
  1393. PROBLEMS).
  1394.  
  1395. ╔N DETERMINING WHICH PACKET SIZE TO USE FOR A FILE TRANSFER (WHERE THE TYPE OF
  1396. TRANSFER IS KNOWN), THE PROTOCOL FINDS THAT LARGEST PACKET SIZE THAT BOTH THE
  1397. CLIENT AND THE SERVER CAN HANDLE AND THEN TAKE THE MINIMUM OF THESE TWO
  1398. VALUES.  ╘HE DEFAULTS FOR THE CLIENT ARE ALL THE SAME: THE MAXIMUM AMOUNT OF
  1399. PROGRAM-AREA MEMORY THAT IT CAN USE, ABOUT 18╦.  ╞OR THE SERVER PROGRAM, ╔
  1400. HAVE PROGRAMMED IN DEFAULT MAXIMUM UPLOADING PACKET SIZES OF 1╦ AND MAXIMUM
  1401. DOWNLOADING PACKET SIZES OF 64╦-1.  ┘OU CAN CHANGE THESE DEFAULTS IN THE ├
  1402. PROGRAM EASILY BY CHANGING SOME "#DEFINE"S.
  1403.  
  1404. ╘HE "-M" OPTION ALLOWS YOU TO MANUALLY SET THE DEFAULT PACKET SIZES FOR A
  1405. TRANSFER.  ╘HE ARGUMENT FOLLOWING THE "-M" FLAG SHOULD HAVE FOUR NUMBERS WITH
  1406. SLASHES BETWEEN THEM, WHICH GIVE THE MAXIMUM ULBIN/ULTXT/DLBIN/DLTXT PACKET
  1407. SIZES, RESPECTIVELY.  ╬OTE THAT THE PACKET SIZES ONLY INCLUDE THE SIZE OF THE
  1408. USER DATA ENCODED INTO PACKETS AND NOT THE CONTROL OR QUOTING INFORMATION
  1409. (BELOW).
  1410.  
  1411. ╘HE "-F" OPTION ON THE SERVER ALLOWS YOU TO READ ARGUMENTS FROM A FILE RATHER
  1412. THAN THE COMMAND LINE.  ╘HIS IS USEFUL IF WANT TO GENERATE AND EDIT THE LIST
  1413. OF FILES TO DOWNLOAD BEFORE YOU RUN THE ╞╪ COMMAND.  ╔T'S ALSO USEFUL IF YOU
  1414. DON'T WANT OTHER USERS TO SEE THE NAMES OF THE FILES THAT YOU ARE
  1415. DOWNLOADING.  ╘HE NAME OF THE FILE COMES IN THE FIRST ARGUMENT FOLLOWING THE
  1416. "-F" FLAG AND THE ARGUMENTS ARE PUT INTO THIS FILE ONE-PER-LINE.  ┘OU CAN PUT
  1417. IN "-" OPTIONS IN ADDITION TO FILENAMES IF YOU WISH (LIKE "-T" AND "-B").
  1418. ╘HIS OPTION IS NOT SUPPORTED ON THE CLIENT PROGRAM.
  1419.  
  1420. ╞INALLY COME THE "-B", "-T", AND FILENAME ARGUMENTS.  ╘HE "-B" ARGUMENT TELLS
  1421. ╞╪ THAT ALL OF THE FOLLOWING FILENAMES (UNTIL THE NEXT "-T" OPTION) ARE BINARY
  1422. FILES AND THE "-T" ARGUMENT SAYS THAT THE FOLLOWING FILENAMES ARE ALL OF TEXT
  1423. FILES.  ┘OU CAN USE AS MANY "-B" AND "-T" ARGUMENTS AS YOU WANT.  ╔F YOU DON'T
  1424. USE ANY, THEN ALL OF THE FILES YOU NAME WILL BE ASSUMED TO BE BINARY FILES.
  1425.  
  1426. ╞OR EACH FILENAME YOU GIVE ON A COMMAND LINE, THAT FILE WILL BE TRANSFERRED
  1427. FROM THAT MACHINE TO THE OTHER MACHINE.  ╧N BOTH ╒NIX AND ┴├┼, YOU CAN USE
  1428. WILDCARDS IN YOUR FILENAMES, OF COURSE, TO TRANSFER GROUPS OF FILES.
  1429.  
  1430. ╘HE CLIENT PROGRAM CONTROLS THE FILE EXCHANGE, AND IT UPLOADS ALL OF ITS FILES
  1431. FIRST AND THEN ASKS THE SERVER IF THE SERVER HAS ANY FILES TO BE DOWNLOADED.
  1432. ╫HEN THE EXCHANGE IS COMPLETED, BOTH THE CLIENT AND SERVER ╞╪ PROGRAMS WILL
  1433. EXIT AND YOU WILL FIND YOURSELF BACK ON THE COMMAND LINES IN BOTH
  1434. ENVIRONMENTS.  ╥E-ENTER THE TERMINAL PROGRAM TO CONTINUE WITH YOUR ONLINE
  1435. SESSION.  ╔F SOMETHING GOES VERY WRONG DURING A TRANSFER OR IF YOU DECIDE THAT
  1436. YOU DON'T REALLY WANT TO TRANSFER ANY FILES AFTER ACTIVATING THE SERVER
  1437. PROGRAM, YOU CAN TYPE THREE ├TRL-╪'S TO ABORT THE SERVER.  ╘HIS IS THE SAME AS
  1438. FOR THE ╪-MODEM PROTOCOL.
  1439.  
  1440. 3. ─┼╙╔╟╬ ─┼├╔╙╔╧╬╙
  1441.  
  1442. ╘HERE ARE A NUMBER OF DESIGN DECISIONS TO BE MADE ABOUT OUR PROTOCOL.  ┬UT
  1443. FIRST, WE WANT TO RECOGNIZE AND APPRECIATE THAT SINCE WE HAVE A LICENSE TO
  1444. DESIGN A COMPLETELY NEW PROTOCOL, WE ARE NOT BOUND, SHACKLED, GAGGED, AND
  1445. TORTURED BY THE "HYSTERICAL RAISINS" AND BAD DESIGN DECISIONS OF EXISTING
  1446. COMPROMISED AND BLOATED STANDARD PROTOCOLS... SUCH AS ┌-MODEM.
  1447.  
  1448. ╫E WANT THE PROTOCOL TO UNDERSTAND WHETHER A FILE IS TEXT OR BINARY DATA AND
  1449. TO TRANSLATE THEM APPROPRIATELY DURING DOWNLOADING.  ╫E WANT THE PROTOCOL TO
  1450. BE AWARE OF FILENAMES, DATES, PERMISSIONS, AND WE DO NOT WANT OUR FILE
  1451. CONTENTS TO GET MANGLED LIKE THEY DO WITH ╪-MODEM (IT PADS THEM WITH ├TRL-┌'S,
  1452. SINCE IT WAS DESIGNED FOR ├╨/═), AND WE WANT IT TO TRANSLATE TO/FROM ╨┼╘╙├╔╔
  1453. IF THE FILE IS TEXT.  ╫E WILL REQUIRE THAT THE USER TELL US WHETHER THE FILE
  1454. IS BINARY OR TEXT (ALTHOUGH WE MAY BE ABLE TO STATISTICALLY DETERMINE THIS
  1455. FROM SNOOPING THROUGH THE FILE), AND WE WILL USE A "CANONICAL FORM" FOR
  1456. ENCODING THE TEXT DATA DURING TRANSFER.  ┴ CONVENIENT CANONICAL FORM TO USE IS
  1457. ╒NIX-┴╙├╔╔ (┴╙├╔╔-╠╞).
  1458.  
  1459. ╫E WANT OUR PROTOCOL TO BE SIMULTANEOUSLY SIMPLE AND FAST.  ╘O MAKE IT SIMPLE,
  1460. WE WILL USE A STOP-AND-WAIT ACKNOWLEDGEMENT SCHEME.  ╘HIS MEANS THAT AFTER
  1461. EACH PACKET IS UPLOADED OR DOWNLOADED, THE TRANSFER WILL PAUSE AND WAIT FOR
  1462. THE RECEIVING HOST TO ACKNOWLEDGE THAT THE PACKET HAS BEEN TRANSFERRED
  1463. CORRECTLY, AND ONLY THEN WILL THE PROTOCOL CONTINUE TO TRANSFER MORE DATA.
  1464.  
  1465. ╔N FACT, THIS SCHEME FITS WELL WITH THE ├OMMODORE HARDWARE, SINCE IT IS NOT
  1466. POSSIBLE TO SEND OR RECEIVE SERIAL DATA WHILE DOING DISK ╔/╧ (IN THE GENERAL
  1467. CASE), SO WE WOULD HAVE TO STOP LISTENING ANYWAY; THE PROTOCOL MAKES IT SO
  1468. THAT THERE WILL BE NO BYTES THAT WE END UP IGNORING WHILE DOING ╔/╧.
  1469.  
  1470. ╘O MAKE THE PROTOCOL BE FAST EVEN THOUGH WE ARE USING A STOP-AND-WAIT
  1471. ACKNOWLEDGEMENT SCHEME, WE WILL USE THE LARGEST DATA-PACKET SIZES THAT WE
  1472. POSSIBLY CAN.  ╔N THE (CURRENT) ┴├┼ ENVIRONMENT, THIS MEANS ABOUT 18╦.  ╘HIS
  1473. WILL MAXIMIZE THE AMOUNT OF TIME OF TRANSFERRING DATA OVER THE MODEM BETWEEN
  1474. PAUSES TO DO ╔/╧.  ╔F THE ╔/╧ IS TO THE ┴├┼ RAMDISK, THEN THE LENGTH OF THIS
  1475. PAUSE WILL BE VERY SHORT AND WE WILL ACHIEVE A VERY HIGH LINK UTILIZATION.
  1476. (╘HE ┴├┼ RAMDISK CAN PROCESS AN 18╦ READ/WRITE REQUEST IN ABOUT 20
  1477. MILLISECONDS ON A ╞AST-MODE ├128 USING AN ╥┼╒ --- ╥┴═─╧╙ IN THE SAME
  1478. ENVIRONMENT WOULD REQUIRE ABOUT 9 _SECONDS_ (450X SLOWER)).
  1479.  
  1480. ╘O ALLOW FOR FUTURE USE WITH OTHER PLATFORMS, WE WILL MAKE THE PROTOCOL DEFINE
  1481. THE PACKET SIZES USING 32-BIT FIELDS.  ╘HERE ISN'T MUCH DATA OVERHEAD, AND
  1482. THIS ALLOWS US TO CHANGE IMPLEMENTATIONS TO BE ABLE TO TRANSFER ENTIRE FILES
  1483. IN ONE LARGE PACKET.  ┴LSO, THE SIZE OF AN INDIVIDUAL PACKET SHOULD BE
  1484. FLEXIBLE: BE FROM ONE TO ╬ BYTES.  ╘HIS ELIMINATES THE ╪-MODEM PADDING PROBLEM
  1485. AND THE ┘-MODEM CRUFTY HACK OF USING THE SMALL PACKET SIZE WHEN LESS THAN 1╦
  1486. OF USER DATA REMAINS TO BE TRANSFERRED.
  1487.  
  1488. ╫E ALSO WANT OUR DATA TO BE WELL PROTECTED AGAINST CORRUPTION.  ─ETECTING
  1489. TRANSMISSION ERRORS EFFICIENTLY ON ├OMMODORE COMPUTERS IS ALREADY A WELL
  1490. SOLVED PROBLEM: WE WILL USE A TABLE-DRIVEN ├╥├-32 ALGORITHM, THE SAME ONE THAT
  1491. ┌═╧─┼═, ╨╦┌╔╨, AND ├╥├32 USE.  ╘O HIDE THE COMPUTATION COSTS OF THE ├╥├ EVEN
  1492. MORE (THE COST IS VERY LOW ANYWAY), WE WILL COMPUTE IT ╫╚╔╠┼ SENDING OR
  1493. RECEIVING PACKETS.  ╧H, ACTUALLY, ╔ GUESS THAT ╔ FORGOT TO MENTION AN A-PRIORI
  1494. DESIGN DECISION: WE WILL BE USING A PACKET-ORIENTED APPROACH FOR TRANSFERRING
  1495. DATA (DESCRIBED BELOW); PACKETIZATION OFFERS SO MANY ADVANTAGES THAT THIS
  1496. DECISION IS REALLY A NO-BRAINER.
  1497.  
  1498. ┴LSO, TO MAKE THE PROCESS INTERACTION AS STRAIGHTFORWARD AS POSSIBLE, WE WANT
  1499. TO USE THE ├LIENT/╙ERVER PROGRAMMING PARADIGM.  ╘HIS PARADIGM COMBINES WELL
  1500. WITH THE STOP-AND-WAIT ACKNOWLEDGEMENT SCHEME TO PRODUCE A ╥EMOTE ╨ROCEDURE
  1501. ├ALL (╥╨├) TYPE OF INTERACTION BETWEEN THE MACHINES.  ╞OR THOSE NOT FAMILIAR
  1502. WITH THIS ╔NTERPROCESS ├OMMUNICATION (╔╨├) SCHEME, YOU CAN READ A COUPLE
  1503. ISSUES OF ├= HACKING AGO WHERE ╔ TALKED ABOUT IT FOR USE WITH A MULTITASKING
  1504. OPERATION SYSTEM.  ╥╨├ IS A VERY USEFUL, POWERFUL, SIMPLE, AND WIDELY
  1505. APPLICABLE ╔╨├ SCHEME.
  1506.  
  1507. ╘O RECOVER FROM PACKET CORRUPTION, WE WILL BE USING A TIMEOUT+RETRANSMISSION
  1508. SCHEME, AND TO BE CONSISTENT WITH THE ╥╨├ SCHEME, THE CLIENT WILL DO ALL
  1509. TIMEOUTS AND RETRANSMISSIONS.  ╘HIS MEANS THAT AFTER SENDING A REQUEST ╥╨├
  1510. PACKET OUT, IF WE DON'T RECEIVE THE REPLY WITHIN A CERTAIN PERIOD OF TIME, WE
  1511. WILL TIMEOUT AND SEND THE REQUEST AGAIN.  ╧R, TO BE MORE PRECISE, SINCE WE
  1512. WILL BE WORKING WITH LARGE PACKET SIZES, WE WILL TIMEOUT IF WE DON'T RECEIVE
  1513. ANY BYTES FROM THE SERVER FOR A CERTAIN PERIOD OF TIME, SAY 5 SECONDS, WHILE
  1514. WE ARE EXPECTING MORE BYTES FROM HIM.
  1515.  
  1516. ╘HE WAY THAT CORRUPTED PACKETS ARE DEALT WITH IS VERY SIMPLE: THEY ARE
  1517. IGNORED.  ╘HE SERVER COULD POSSIBLY SEND BACK A NEGATIVE ACKNOWLEDGEMENT,
  1518. BUT WE WON'T TRY THAT FOR NOW.
  1519.  
  1520. ╔N ORDER TO MAKE RETRANSMISSIONS WORK OUT CORRECTLY, WE WILL BE USING SEQUENCE
  1521. NUMBERS AND INTERNAL-STATE VARIABLES INSIDE OF THE SERVER TO INSURE THAT
  1522. REQUESTS AREN'T CARRIED OUT MORE THAN ONCE.  ╫E NEED THESE MECHANISMS BECAUSE
  1523. WHEN AN ╥╨├ FAILS, WE WON'T KNOW IF WE GOT NO RESPONSE BECAUSE THE ORIGINAL
  1524. REQUEST WAS LOST AND THE OPERATIONS WASN'T CARRIED OUT, OR WHETHER THE REQUEST
  1525. WAS RECEIVED AND CARRIED OUT BUT THE REPLY MESSAGE WAS LOST.
  1526.  
  1527. ╞OR EXAMPLE, IF WE REQUEST THAT PACKET #123 BE DOWNLOADED AND THE SERVER
  1528. CARRIES OUT THAT REQUEST BUT THE REPLY MESSAGE IS LOST, THEN THE CLIENT WILL
  1529. TIME OUT AND RETRANSMIT THE REQUEST.  ╘HE SERVER REMEMBERS THE LAST REQUEST
  1530. NUMBER THAT THE CLIENT SENT IT (123 HERE), SO IF THE CLIENT ASKS FOR PACKET
  1531. #123 AGAIN, THE SERVER WILL SIMPLY RETRANSMIT THE REPLY THAT IT GAVE LAST
  1532. TIME.  ╔F, ON THE OTHER HAND, THE CLIENT WERE TO REQUEST PACKET #124 (OR
  1533. SIMPLY "NOT 123"), THEN THE SERVER READS THE NEXT CHUNK OF DATA FROM THE FILE
  1534. AND SENDS IT AS THE REPLY.  ╧UR PROTOCOL WILL USE AN 8-BIT SEQUENCE NUMBER
  1535. EVEN THOUGH IT ONLY NEEDS A 1-BIT SEQUENCE NUMBER (SINCE EIGHT BITS WILL ALLOW
  1536. FOR THE FUTURE EXPANSION OF HAVING MULTIPLE REQUESTS BEING PROCESSED
  1537. CONCURRENTLY: ASYNCHRONOUS ╥╨├).
  1538.  
  1539. ╫E ALSO WANT TO BE ABLE TO BOTH UPLOAD AND DOWNLOAD AS CONVENIENTLY AS
  1540. POSSIBLE.  ╘O ME, THIS MEANS DOING BOTH OPERATIONS BY CALLING ONLY ONE COMMAND
  1541. (AS DESCRIBED IN THE PREVIOUS SECTION).  ╘HIS ARRANGEMENT ALSO ALLOWS FOR THE
  1542. FUTURE EXPANSION OF UPLOADING AND DOWNLOADING FILES _SIMULTANEOUSLY_ (THE
  1543. PROTOCOL AS DESIGNED PLACES NO RESTRICTIONS ON THIS POSSIBILITY).
  1544.  
  1545. ╫E ALSO WANT TO MAKE USE OF AN EIGHT-BIT CLEAN LINK BETWEEN THE ╒NIX HOST AND
  1546. YOUR ├OMMODORE, BUT THIS MAY NOT ALWAYS BE POSSIBLE.  ╙OMETIMES YOU MAY HAVE
  1547. ONLY A 7-BIT CONNECTION, AND EVEN IF YOU DO HAVE AN 8-BIT CONNECTION, THERE
  1548. MAY STILL BE SOME SOFTWARE-FLOW-CONTROL PROBLEMS WITH INTERMEDIATE DEVICES
  1549. BETWEEN YOUR ├OMMODORE AND YOUR ╒NIX HOST.  ╙O, WE WANT OUR PROTOCOL TO NOT
  1550. MAKE USE OF THE ╪-ON AND ╪-OFF CHARACTERS, AND TO USE ONLY 7-BIT CHARACTERS IF
  1551. IT CANNOT USE EIGHT.  ╘HE WAY TO ACHIEVE THIS IS CALLED "ESCAPING", "QUOTING"
  1552. OR "BYTE STUFFING", AND WILL BE DISCUSSED IN THE NEXT SECTION.  ╔T TURNS OUT
  1553. THAT SUPPORTING 7-BIT CHARACTERS IS PRETTY SIMPLE AND THE MECHANISM IS
  1554. REQUIRED BY OTHER ASPECTS OF THE PACKETIZATION.
  1555.  
  1556. ╘HERE, THAT SHOULD TAKE CARE OF MOST OF THE MAJOR DESIGN DECISIONS.
  1557.  
  1558. 4. ╨┴├╦┼╘╔┌┴╘╔╧╬
  1559.  
  1560. ╨ACKETIZATION REFERS TO THE PROCESS OF TAKING A STREAM OF DATA AND BREAKING IT
  1561. UP INTO DISCRETE CHUNKS OF DATA.  ┼ACH PACKET IS EASILY IDENTIFIED AND IS
  1562. PROCESSED AS A SINGLE UNIT.  ╘HERE ARE MANY GENERAL ADVANTAGES TO USING
  1563. PACKETS.  ╔F THERE IS A TRANSMISSION ERROR, THEN ONLY A SINGLE PACKET IS
  1564. CORRUPTED, AND THE RECOVERY WILL BE EASIER SINCE THE PACKET IS WELL
  1565. IDENTIFIED, AND ONLY IT NEEDS TO BE RECOVERED.  ╨ACKETIZATION ALSO MEANS THAT
  1566. A LINK CAN BE SHARED BETWEEN MULTIPLE (LOGICAL) COMMUNICATION STREAMS FAIRLY
  1567. AND EFFICIENTLY, AND MEANS THAT A SINGLE COMMUNICATION STREAM CAN UTILIZE
  1568. MULTIPLE PHYSICAL LINKS WHERE FACILITIES EXIST.
  1569.  
  1570. ╨ACKETS ALSO INTEGRATE WELL WITH MANY ╔╨├ SCHEMES, INCLUDING ╥EMOTE ╨ROCEDURE
  1571. ├ALLS.  ╔N FACT, YOU END UP EMULATING A PACKET-ORIENTED SCHEME EVEN IF YOU ARE
  1572. USING ╥╨├ OVER A STREAM-ORIENTED TRANSPORT SYSTEM.  ╨ACKETS ALSO TAKE INTO
  1573. ACCOUNT THE LIMITED BUFFERING CAPACITY OF BOTH END SYSTEMS AND INTERMEDIATE
  1574. SYSTEMS, AND ALLOW FOR THE CONVENIENT IMPLEMENTATION OF FLOW CONTROL (EVEN IF
  1575. SAID FLOW CONTROL CONSISTS OF SIMPLY DROPPING PACKETS ON THE FLOOR).  ╨ACKETS
  1576. ARE VERY USEFUL THINGS INDEED!  ┴ND JUST THINK THAT BACK IN THE EARLY 1970S
  1577. PACKETS WERE DISMISSED AS BEING INFEASIBLE AND UNUSABLE.
  1578.  
  1579. ┼ACH PACKET USED IN THE ╞╪ SYSTEM HAS FOUR PARTS TO IT: THE START CHARACTER,
  1580. THE USER DATA (PAYLOAD), THE ERROR-CHECK CHARACTERS, AND THE END CHARACTER.
  1581. ╟RAPHICALLY, A PACKET HAS THE FOLLOWING FORMAT:
  1582.  
  1583. +------------------------+-----------+--------------+----------------------+
  1584. ▄  ╙TART-OF-PACKET ├HAR  ▄  ╨AYLOAD  ▄  ┼RROR├HECK  ▄  ┼ND-OF-PACKET ├HAR  ▄
  1585. +------------------------+-----------+--------------+----------------------+
  1586.  
  1587. ╘HE PAYLOAD CAN BE ARBITRARILY LONG, UP TO WHATEVER LIMIT THE TWO COMPUTERS
  1588. INVOLVED IN THE TRANSFER CAN HANDLE.
  1589.  
  1590. ╘HE ERROR CHECK IS A 32-BIT (4-BYTE) ├YCLIC-╥EDUNDANCY-├HECK VALUE THAT
  1591. OCCUPIES THE LAST FOUR BYTES BEFORE THE ┼ND-OF-PACKET CHARACTER.  ╘HE
  1592. IMPLEMENTATION, WHICH IS BASED ON A TABLE-LOOKUP METHOD, IS SO EFFICIENT THAT
  1593. IT IS AS FAST AS A SIMPLE ADD-UP CHECKSUM, EXCEPT MUCH MORE RELIABLE.  ╒SING
  1594. THIS ERROR CHECK, THERE WILL BE APPROXIMATELY A ONE-IN-4,000,000,000 CHANCE
  1595. THAT A PACKET WITH AN ERROR IN IT WILL BE ACCEPTED HAS BEING ERROR-FREE.
  1596. ╘HESE ARE PRETTY GOOD ODDS FOR OUR PURPOSES.  ╘HE ├╥├ IS CALCULATED
  1597. EXCLUSIVELY ON THE RAW PAYLOAD DATA.
  1598.  
  1599. ╘HE FOLLOWING SPECIAL CHARACTERS USED BY PACKETS ARE DEFINED:
  1600.  
  1601. ╬┴═┼         ╚┼╪   ─┼├   ├ONTROL   ═EANING
  1602. ---------   ----   ---   -------   --------
  1603. ├╚╥_╙╘┴╥╘   0X01     1   ├TRL-┴    ╨ACKET-START INDICATOR
  1604. ├╚╥_┼╬─     0X19    25   ├TRL-┘    ╨ACKET-END INDICATOR
  1605. ├╚╥_┼╙├     0X05     5   ├TRL-┼    ┼SCAPE CHARACTER FOR NEXT CODE
  1606. ├╚╥_┴┬╧╥╘   0X18    24   ├TRL-╪    ┴BORT TRANSFER IF REPEATED THREE TIMES
  1607. ├╚╥_╪╧╬     0X11    17   ├TRL-╤    ╙OFTWARE FLOW-START: AVOIDED
  1608. ├╚╥_╪╧╞╞    0X13    19   ├TRL-╙    ╙OFTWARE FLOW-STOP: AVOIDED
  1609. ├╚╥_╤╒╧╘┼8  0X14    20   ├TRL-╘    ╤UOTE-8 THE NEXT 7-BIT SEQUENCE
  1610.  
  1611. ├╚╥_╙╘┴╥╘ IS USED TO SIGNIFY THE START OF A NEW PACKET.  ╘HIS CHARACTER IS
  1612. NOT ALLOWED TO BE USED ANYWHERE ELSE FOR ANY OTHER PURPOSE.
  1613.  
  1614. ├╚╥_┼╬─ IS USED TO SIGNIFY THE END OF THE CURRENT PACKET, AND CANNOT BE USED
  1615. ANYWHERE ELSE.  ╘HE REASON FOR USING SPECIAL CHARACTERS TO MARK THE BEGINNING
  1616. AND THE ENDING OF A PACKET IS TO ALLOW FOR EASY ERROR RECOVERY AFTER A
  1617. COMMUNICATION FAILURE.  ┴LL YOU DO IS SEARCH FOR THE NEXT ├╚╥_╙╘┴╥╘ CHARACTER
  1618. AFTER YOU TOSS AWAY A GARBLED PACKET AND YOU'RE BACK IN BUSINESS.  ╔ AM
  1619. UNAWARE OF ANY REASONABLE ALTERNATIVES TO FRAMING PACKETS WITH A ├╚╥_╙╘┴╥╘
  1620. CHARACTER.  ╒SING A ├╚╥_┼╬─ SPECIAL CHARACTER IS A CONVENIENCE.
  1621.  
  1622. ├╚╥_┼╙├ IS USED TO "ESCAPE" THE NEXT CHARACTER.  ╙INCE THERE ARE SPECIAL
  1623. CHARACTER CODES THAT CANNOT BE USED IN ANY OTHER WAY THAN THEIR INTENDED
  1624. FUNCTION (INCLUDING ├╚╥_╙╘┴╥╘ AND ├╚╥_┼╙├ ITSELF), THIS CHARACTER IS NEEDED.
  1625. ╘HE CHARACTER FOLLOWING THE ├╚╥_┼╙├ CHARACTER MUST BE BETWEEN "@" AND "_"
  1626. (0X40 AND 0X5F) IN THE ┴╙├╔╔ CHART, OR BE THE CHARACTER "?" (0X3F).  ╘HE
  1627. CHARACTER FOLLOWING THE ├╚╥_┼╙├ IS THEN "AND"ED WITH THE VALUE 0X1F TO MASK
  1628. OFF THE "LETTER" BITS AND TURN IT INTO A CONTROL CHARACTER IN THE RANGE OF
  1629. 0X00 TO 0X1F (THE SAME RANGE AS THE SPECIAL CONTROL CHARACTERS) AND THE
  1630. "ESCAPE SEQUENCE" IS TREATED AS A SINGLE CHARACTER OF USER DATA.  ╔F THE
  1631. CHARACTER FOLLOWING THE ├╚╥_┼╙├ IS A "?", THEN A CODE OF 0X7F IS INTERPRETED
  1632. INSTEAD.  ╒SING A CHARACTER FOLLOWING THE ESCAPE THAT IS DIFFERENT FROM THE
  1633. CHARACTER BEING REPRESENTED ALLOWS FOR GREATER RESILIANCE OF THE PROTOCOL IN
  1634. THE PRESENCE OF BITS BEING GARBLED OR BYTES BEING DROPPED.  ┴LL SPECIAL
  1635. CHARACTERS IN A PACKET EXCEPT FOR THE STARTING AND ENDING CHARACTERS ARE
  1636. ESCAPED AS DESCRIBED ABOVE.
  1637.  
  1638. ├╚╥_┴┬╧╥╘ CAN BE TYPED BY THE USER INTO A TERMINAL PROGRAM AT ANY TIME TO SHUT
  1639. DOWN THE SERVER.
  1640.  
  1641. ├╚╥_╪╧╬ AND ├╚╥_╪╧╞╞ CAN CAUSE PROBLEMS WITH INTERMEDIATE DEVICES ON SOME
  1642. SYSTEMS, SO THE ╞╪ PROTOCOL DOES NOT USE THESE CHARACTER CODES AT ALL; IT
  1643. PURPOSELY AVOIDS THEM AND USES ESCAPE SEQUENCES (├╚╥_┼╙├) FOR THEM INSTEAD.
  1644.  
  1645. ├╚╥_╤╒╧╘┼8 IS USED TO RE-GENERATE 8-BIT DATA OVER A 7-BIT LINK.  ╦ERMIT USES
  1646. THIS SAME TECHNIQUE.  ╫HEN THIS CHARACTER IS ENCOUNTERED IN THE RECEIVE
  1647. STREAM, THE NEXT CHARACTER IS EXTRACTED AND IS "OR"ED WITH A VALUE OF 0X80 TO
  1648. GIVE IT A "1" IN THE HIGH-BIT POSITION.  ╘HE ├╚╥_╤╒╧╘┼8 CHARACTER CAN ALSO BE
  1649. FOLLOWED BY A ├╚╥_┼╙├ CODE, WHICH IS INTERPRETED AS ABOVE AND THEN "OR"ED WITH
  1650. THE 0X80 VALUE.
  1651.  
  1652. ╧NE OF THE DISADVANTAGES OF USING THIS SCHEME IS THAT EACH BYTE IN THE RANGE
  1653. OF 0X80 AND 0XFF TAKES AT LEAST TWO BYTES TO TRANSMIT AND SOME OF THEM THREE.
  1654. ╔F FACT, FOR MANY BINARY FILES IT MAY BE FASTER TO UUENCODE THE FILE AND
  1655. TRANSFER THE RESULTING TEXT, SINCE UUCODE HAS A STATIC ENCODING OVERHEAD OF
  1656. 33% WHEREAS THIS QUOTING SCHEME HAS AN EXPECTED OVERHEAD OF 50% (PLUS THE
  1657. ├╚╥_┼╙├ OVERHEAD).  ╧F COURSE, THIS FEATURE IS INTENDED TO BE USED AS A LAST
  1658. RESORT IF YOU CANNOT GET AN 8-BIT CONNECTION.
  1659.  
  1660. ╙O THERE YOU HAVE IT.  ┼VERY MESSAGE SENT BETWEEN THE CLIENT AND THE SERVER
  1661. IS ENCAPSULATED IN A PACKET AS SPECIFIED ABOVE.  ╨ACKETIZATION ALLOWS FOR
  1662. CONVENIENT ERROR DETECTION AND RECOVERY AND WORKS WELL WITH OUR INTERPROCESS
  1663. COMMUNICATION SCHEME.
  1664.  
  1665. ╧NE IMPLEMENTATION NOTE ABOUT THE PACKETIZATION HAS TO DO WITH BUFFERING.  ╧N
  1666. THE ╒NIX HOST, IT IS ADVANTAGEOUS TO ENCODE A PACKET INTO A MEMORY BUFFER AND
  1667. THEN SEND OUT THAT BUFFER IN A SINGLE "WRITE" OPERATION.  ╘HIS LESS OPERATING-
  1668. SYSTEM OVERHEAD (WHICH MAY OR MAY NOT BE SIGNIFICANT) BUT MORE IMPORTANTLY,
  1669. IT MEANS THAT THE PACKET WILL BE SENT BETWEEN INTERMEDIATE COMMUNICATION
  1670. DEVICES AS EFFICIENTLY AS POSSIBLE.  ╧N MY LOCAL ╒NIX SYSTEM, ╔ CONNECT TO
  1671. A TERMINAL SERVER AND TO MY ╒NIX HOST THROUGH THAT.  ╨ERFORMING SINGLE-BYTE
  1672. WRITES ON THE ╒NIX HOST MEANS THAT THE BYTES ARE SENT IN INDIVIDUAL ┼THERNET
  1673. PACKETS BETWEEN THE ╒NIX HOST AND THE TERMINAL SERVER, AND ENCOUNTER MORE
  1674. OVERHEAD AND COMMUNICATION DELAYS.  ╫HEN ╔ CHANGED THE PROGRAM TO SEND THE
  1675. ╞╪ PACKET IN A SINGLE OPERATION, A SIGNIFICANT PERFORMANCE GAIN WAS REALIZED.
  1676.  
  1677. ╞OR RECEIVING DATA ON THE ╒NIX HOST, THERE ISN'T MUCH YOU CAN DO OTHER THAN
  1678. READING ONE BYTE AT A TIME, SINCE THE RECEIVER DOESN'T KNOW WHEN A PACKET IS
  1679. GOING TO END.  ╚OWEVER, THE SAME PROBLEM IS NOT ENCOUNTERED HERE THAT WAS
  1680. ENCOUNTERED WITH SENDING DATA BECAUSE DATA THAT IS RECEIVED BY THE ╒NIX HOST
  1681. BUT NOT "READ" BY THE USER PROGRAM ARE BUFFERED AND COLLECTED, SMOOTHING OUT
  1682. THE SYSTEM OVERHEAD, WHICH IS INSIGNIFICANT COMPARED TO THE MODEM SPEED.  ╘HE
  1683. ╒NIX PROGRAM USED THE "STDIN" AND "STDOUT" FILE STREAMS FOR RECEIVING AND
  1684. TRANSMITTING DATA, AND SETS THE TTY DRIVER TO TURN OFF ALL LINE-EDITING
  1685. FEATURES TO GET AT THE RAW BYTES.
  1686.  
  1687. ╧N THE ├OMMODORE END, IT IS ADVANTAGEOUS TO READ DATA FROM THE MODEM DRIVER IN
  1688. CHUNKS, SINCE THE SYSTEM OVERHEAD IS SIGNIFICANT COMPARED TO THE MODEM SPEED.
  1689. ╘HESE ARE SMALL COMPUTERS THAT WE ARE DRIVING TO THE MAX, YOU KNOW.  ─ATA IS
  1690. READ FROM THE MODEM IN CHUNKS OF UP TO 255 BYTES (WHATEVER IS AVAILABLE AT THE
  1691. TIME) AND PROCESSED A BYTE AT A TIME FROM THE READ BUFFER.  ╘HE ├╥├ IS
  1692. CALCULATED DURING PROCESSING, TO AVOID DOING THIS ON THE CRITICAL PATH.  ╘HE
  1693. ├╥├ CALCULATION IS PERFORMED AS AN OPERATION BY ITSELF SINCE THE OVERHEAD IS
  1694. VERY SMALL ON FAST PROCESSORS.  ╘HE CHARACTER-SET TRANSLATION FOR TEXT FILES
  1695. WILL BE PERFORMED ON THE CRITICAL PATH (ON THE ├OMMODORE) SINCE IT IS MORE
  1696. CONVENIENT TO DO IT AT A HIGHER LAYER IN THE ╔╨├ SCHEME.  ╘HE PACKET- HANDLING
  1697. SOFTWARE IS LOGICALLY AT A DISTINCT LAYER THAT DOESN'T HAVE TO WORRY ABOUT
  1698. HIGHER LAYERS.  ╘HE NEXT LAYER UP IS LOGICALLY THE ╥╨├ LAYER AND THEN THE
  1699. FILE-TRANSFER LAYER.
  1700.  
  1701. 5. ├╠╔┼╬╘/╙┼╥╓┼╥ ╧╨┼╥┴╘╔╧╬
  1702.  
  1703. ┴S DISCUSSED PREVIOUSLY, THE CLIENT/SERVER INTERACTION IS BASED ON A ╥EMOTE
  1704. ╨ROCEDURE ├ALL PARADIGM.  ╘HUS, FOR EACH OPERATION, THE CLIENT SENDS A REQUEST
  1705. PACKET (MESSAGE) TO THE SERVER, AND THE SERVER PERFORMS THE REQUESTED
  1706. OPERATION AND SENDS BACK A REPLY (ACKNOWLEDGEMENT) MESSAGE TO THE CLIENT.
  1707.  
  1708. ╘HERE ARE EIGHT REQUEST/ACK INTERACTIONS THAT ARE DEFINED FOR THE PROTOCOL:
  1709. TWO FOR CONNECTION MANAGEMENT, THREE FOR UPLOADING FILES, AND THREE FOR
  1710. DOWNLOADING FILES.  ╘HE CLIENT IS IN CHARGE OF THE FILE-EXCHANGE SESSION
  1711. AND OF THE ERROR HANDLING.
  1712.  
  1713. 4.1. ├╧╬╬┼├╘╔╧╬ ═┴╬┴╟┼═┼╬╘
  1714.  
  1715. ╫HEN THE CLIENT STARTS UP, THE FIRST THING THAT IT DOES IS CONNECT TO THE
  1716. SERVER.  ╘HE FORMAT OF THE MESSAGE THAT IT SENDS IS AS FOLLOWS:
  1717.  
  1718. ╧╞╞   ╙╔┌   ─┼╙├
  1719. ---   ---   -----
  1720.   0     1   CODE: ╥┼╤_├╧╬╬┼├╘ ('├')
  1721.   1     1   PROTOCOL VERSION := 0X01
  1722.   2     1   TRANSMIT BYTE SIZE: '7' OR '8' BITS
  1723.   3     -   ╙╔┌┼
  1724.  
  1725. ╘HIS IS WHAT GETS PUT INTO THE THE "PAYLOAD" PORTION OF THE PACKET.  ┴LL OF
  1726. THE MESSAGES USED IN THE PROTOCOL HAVE AN ┴╙├╔╔ LETTER IN THE FIRST BYTE THAT
  1727. IDENTIFIES WHAT THE MESSAGE TYPE IS.  ┼ACH REQUEST HAS AN UPPERCASE LETTER AND
  1728. EACH ACKNOWLEDGEMENT HAS THE CORRESPONDING LOWERCASE LETTER.
  1729.  
  1730. ╘HE CONNECTION-REQUEST MESSAGE IS FAIRLY SIMPLE: IT INCLUDES THE PROTOCOL
  1731. VERSION NUMBER AND THE NUMBER OF BITS WIDE THAT THE CLIENT THINKS THAT THE
  1732. COMMUNICATION CHANNEL IS.  ╘HE VERSION NUMBER IS CURRENTLY ALWAYS 0X01 AND IS
  1733. INCLUDED FOR CROSS-COMPATIBILITY WITH FUTURE VERSIONS OF THE PROTOCOL.  ╘HE
  1734. CHANNEL WIDTH IS ENCODED INTO EITHER A '7' OR AN '8' ┴╙├╔╔ CHARACTER.  ╘HE
  1735. CLIENT WILL THINK THAT THE CHANNEL WIDTH IS SEVEN BITS ONLY IF YOU TELL IT
  1736. THIS ON THE COMMAND LINE.
  1737.  
  1738. ╫HEN THE SERVER RECEIVES THE CONNECTION REQUEST, IT REPLIES WITH THE FOLLOWING
  1739. MESSAGE:
  1740.  
  1741. ╧╞╞   ╙╔┌   ─┼╙├
  1742. ---   ---   -----
  1743.   0     1   CODE: ┴├╦_├╧╬╬┼├╘ ('C')
  1744.   1     1   PROTOCOL VERSION := 0X01
  1745.   2     1   TRANSMIT BYTE SIZE: '7' OR '8' BITS
  1746.   3     1   RECOMMENDED REQUEST BYTE SIZE: '7' OR '8' BITS
  1747.   4     4   SERVER MAXIMUM TEXT-UPLOAD DATA SIZE: ╚/═/═/╠ WORD
  1748.   8     4   SERVER MAXIMUM BINARY-UPLOAD DATA SIZE: ╚/═/═/╠ WORD
  1749.  12     4   SERVER MAXIMUM TEXT-DOWNLOAD DATA SIZE: ╚/═/═/╠ WORD
  1750.  16     4   SERVER MAXIMUM BINARY-DOWNLOAD DATA SIZE: ╚/═/═/╠ WORD
  1751.  20     -   ╙╔┌┼
  1752.  
  1753. ╘HE "PROTOCOL VERSION" IS WHAT THE SERVER IS USING, CURRENTLY ALWAYS 0X01.
  1754. ╘HE "TRANSMIT BYTE SIZE" IS THE SIZE THAT THE USER HAS SPECIFIED ON THE
  1755. COMMAND LINE THAT ACTIVATED THE SERVER, AND THE "RECOMMENDED REQUEST BYTE
  1756. SIZE" IS A '7' IF EITHER THE "TRANSMIT BYTE SIZE" OF THE EITHER THE CLIENT OR
  1757. SERVER IS SEVEN BITS, OR '8' OTHERWISE.  ╘HIS IS WHAT SHOULD BE USED FOR THE
  1758. ALL SUBSEQUENT MESSAGES THAT ARE EXCHANGED.
  1759.  
  1760. ╘HE SERVER'S REPLY ALSO INCLUDES THE MAXIMUM PACKET SIZES THAT IT CAN HANDLE
  1761. FOR UPLOADING AND DOWNLOADING BINARY AND TEXT FILES.  ╘HE CLIENT THEN TAKES
  1762. THE "MIN" OF THE SERVER'S MAXIMUM PACKET SIZES AND ITS OWN, AND USES THE
  1763. RESULTING MAXIMUM PACKET SIZES FOR THE REST OF THE FILE EXCHANGE SESSION.  ╘HE
  1764. MAXIMUM PACKET SIZES IN THE SERVER'S REPLY ARE ALL 32-BIT UNSIGNED INTEGERS
  1765. THAT ARE STORED FROM MOST-SIGNIFICANT TO LEAST-SIGNIFICANT BYTES (BIG ENDIAN
  1766. ORDER).  ╔ PICKED BIG-ENDIAN ORDER BECAUSE THAT IS THE ORDER USED MOST
  1767. COMMONLY IN INTER-MACHINE PROTOCOLS.
  1768.  
  1769. ╘HE REASON THAT THE CLIENT DOESN'T HAVE TO INFORM THE SERVER OF THE CLIENT'S
  1770. MAXIMUM PACKET SIZES IN ITS CONNECTION MESSAGE IS THAT THE MAXIMUM PACKET
  1771. SIZE TO USE IS INCLUDED WITH EACH REQUEST TO GET THE NEXT PACKET OF A DOWNLOAD
  1772. FILE.  ╔T IS SUFFICIENT THAT THE CLIENT KNOWS THE FULL MAX-PACKET INFORMATION.
  1773. ╥EALLY, THE "TRANSMIT BYTE SIZE" FIELD ISN'T NEEDED IN THE SERVER REPLY
  1774. MESSAGE EITHER, BUT ╔ WANTED THE PACKET-SIZE FIELDS TO BE SIZE-ALIGNED.
  1775.  
  1776. ┴FTER ALL OF THE FILE EXCHANGING IS COMPLETED, THE CLIENT SENDS THE FOLLOWING
  1777. MESSAGE TO TERMINATE THE CONNECTION AND RETURN THE SERVER BACK TO ITS COMMAND-
  1778. LINE MODE:
  1779.  
  1780. ╧╞╞   ╙╔┌   ─┼╙├
  1781. ---   ---   -----
  1782.   0     1   CODE: ╥┼╤_─╔╙├╧╬╬┼├╘ ('╤')
  1783.   1     -   ╙╔┌┼
  1784.  
  1785. ╫HEN THE SERVER RECEIVES THIS REQUEST, IT REPLIES WITH:
  1786.  
  1787. ╧╞╞   ╙╔┌   ─┼╙├
  1788. ---   ---   -----
  1789.   0     1   CODE: ┴├╦_─╔╙├╧╬╬┼├╘ ('Q')
  1790.   1     -   ╙╔┌┼
  1791.  
  1792. ┴ND THEN EXITS LIKE IT SHOULD.  ╬OTE THAT ONCE THE SERVER EXITS, IT CANNOT
  1793. ACCEPT ANY MORE PACKETS, SINCE THEY WOULD BE SENT TO WHATEVER COMMAND SHELL
  1794. YOU USE ON YOUR ╒NIX SYSTEM, AND WOULDN'T DO ANYTHING USEFUL, SO IF THE CLIENT
  1795. SENDS THE DISCONNECT MESSAGE BUT DOESN'T RECEIVE ANY REPLY, IT WILL TIME OUT
  1796. AND TELL THE USER THAT IT COULDN'T DISCONNECT CLEANLY FROM THE SERVER.  ╘HIS
  1797. SHOULD BE A RARE OCCURRENCE.  ┴NYWAY, WHAT THE USER WOULD DO THEN IS RE-ENTER
  1798. HIS TERMINAL PROGRAM AND SEND ├TRL-╪'S AT THE SERVER UNTIL IT EXITS LIKE IT
  1799. SHOULD HAVE.
  1800.  
  1801. ╘HIS ARRANGEMENT ALLOWS US TO AVOID THE FAMOUS(?) "TWO ARMIES" PROBLEM THAT IS
  1802. INHERENT IN DISCONNECTING TWO CONNECTED PROCESSES: THERE IS NO "CLEAN" WAY TO
  1803. DO IT.  ╫HAT SYSTEMS LIKE ┌-═ODEM AND ┬ERKELEY ╙OCKETS DO IS TO HAVE THE
  1804. SERVER WAIT FOR A PERIOD OF TIME THAT IS LONGER THAN ╬ TIMES THE TIMEOUT
  1805. PERIOD OF THE CLIENT SO THAT IF THERE IS A RETRANSMISSION OF THE DISCONNECTION
  1806. REQUEST, IT LIKELY THAT IT WILL BE RECEIVED AND PROCESSED CORRECTLY BY THE
  1807. SERVER.  ╘HIS IS THE REASON (PRESUMABLY) THAT ┌-═ODEM DOES AN ANNOYING PAUSE
  1808. OF 15 SECONDS OR SO AFTER YOU FINISH TRANSFERRING FILES.  ╔ THINK THAT MY
  1809. SOLUTION IS MUCH NICER, SINCE THE SERVER CAN EXIT IMMEDIATELY (EVEN THOUGH MY
  1810. SERVER DELAYS FOR 1 SECOND, JUST SO THAT YOUR SHELL PROMPT WILL BE CLEANLY IN
  1811. YOUR MODEM'S ┴╥╤ BUFFER WHEN YOU RE-ENTER YOUR TERMINAL PROGRAM, IF YOU HAVE A
  1812. HARDWARE-FLOW-CONTROL MODEM).
  1813.  
  1814. 4.2. ╞╔╠┼ ╒╨╠╧┴─╔╬╟
  1815.  
  1816. ╧KAY, SO BETWEEN CONNECTING TO AND DISCONNECTING FROM THE SERVER, ACTUAL
  1817.  
  1818. USEFUL STUFF HAPPENS, INCLUDING UPLOADING AND DOWNLOADING FILES.  ╘HE
  1819. UPLOADING AND DOWNLOADING REQUESTS OPERATE MUCH LIKE THE REGULAR FILE
  1820. OPERATIONS OF OPEN, CLOSE, READ, AND WRITE.  ╥EALLY, THE ╞╪ PROTOCOL MAKES THE
  1821. SERVER PROGRAM A SPECIAL KIND OF FILE SERVER.
  1822.  
  1823. ╫HEN THE CLIENT DECIDES THAT IT WANTS TO UPLOAD A FILE, IT FIRST INFORMS THE
  1824. SERVER ABOUT THIS BY SENDING THE FOLLOWING MESSAGE:
  1825.  
  1826. ╧╞╞   ╙╔┌   ─┼╙├
  1827. ---   ---   -----
  1828.   0     1   CODE: ╥┼╤_╒╨╠╧┴─_╧╨┼╬ ('╒')
  1829.   1     1   DATA TYPE: 'T'=TEXT FILE, 'B'=BINARY FILE: 'D'=DIRECTORY
  1830.   2     4   ESTIMATED FILE SIZE: ╚/═/═/╠ WORD
  1831.   6     2   PERMISSIONS ("-----SGR:WXRWXRWX"), LIKE ╒NIX, ╚:╠
  1832.   8    12   MODIFIED DATE: ┬├─ FORMAT: <┘┘:┘┘:══:──:HH:MM:SS:TT:TW:╟╟:GG:AA>
  1833.  20     N   FILENAME, NULL-TERMINATED
  1834. 20+N    -   ╙╔┌┼
  1835.  
  1836. ╘HE "DATA TYPE" FIELD TELLS WHETHER A TEXT OR BINARY FILE WILL BE UPLOADED.
  1837. ╘HERE IS A PROVISION FOR "UPLOADING" A DIRECTORY ENTRY (AS PART OF UPLOADING
  1838. AND DOWNLOADING ENTIRE DIRECTORY HIERARCHIES), BUT SUPPORT FOR THIS IS NOT
  1839. IMPLEMENTED YET.  ┴LSO, IT MAKES NO DIFFERENCE TO A ╒NIX SYSTEM WHETHER A FILE
  1840. CONTAINS TEXT OR BINARY DATA, BUT IT MAY MAKE A DIFFERENCE TO OTHER OPERATING
  1841. SYSTEMS (LIKE ═ESS-─╧╙).  ╘HE "ESTIMATED FILE SIZE" FIELD ISN'T REALLY USED
  1842. EITHER, BUT IT ALLOWS THE SERVER TO MAKE INTELLIGENT DECISIONS ABOUT
  1843. PRE-ALLOCATING SPACE, BUFFERING, ETC., IF IT NEEDED TO.  ╚OWEVER, IT IS
  1844. CURRENTLY NOT FILLED IN BY THE CLIENT, SINCE FILE-SIZE INFORMATION IS
  1845. DIFFICULT TO EXTRACT FROM ├OMMODORE-─╧╙.  ╘HE FILE SIZE IS AN UNSIGNED 32-BIT
  1846. QUANTITY.
  1847.  
  1848. ╘HE PERMISSIONS FIELD IS CURRENTLY NOT SUPPORTED BY THE SERVER, BUT IT IS
  1849. INTENDED TO ALLOW FILE PERMISSIONS TO BE PRESERVED WHEN PASSING FILES FROM ONE
  1850. SYSTEM TO ANOTHER.  ╘HE INTERPRETATION OF THE 16 BITS OF THIS FIELD IS LIKE IT
  1851. IS WITH THE ╒NIX OPERATING SYSTEM: "RWX" BITS FOR THE OWNER, GROUP, AND OTHER,
  1852. AND EXECUTE-AS-OWNER, EXECUTE-AS-GROUP BITS.  ╘HE OWNER-ID AND GROUP-ID FIELDS
  1853. AREN'T INCLUDED SINCE THEY ARE GENERALLY NOT PORTABLE ACROSS SYSTEMS, AND EVEN
  1854. IF THEY WERE, WE USUALLY WANT TO RECEIVE FILES AS OUR OWN OWNER-ID AND OUR OWN
  1855. GROUP-ID.
  1856.  
  1857. ╘HE "MODIFICATION DATE" FIELD IS NOT CURRENTLY FILLED IN EITHER, SINCE THIS
  1858. INFORMATION IS EVEN HARDER TO COME ACROSS WITH ├OMMODORE-─╧╙, BUT WHEN IT IS,
  1859. IT WILL HAVE A 12-BYTE ┬├─ FORMAT.  ╘HE "┘┘:┘┘:══:──:HH:MM:SS" SUB-FIELDS
  1860. SHOULD BE EASY ENOUGH TO FIGURE OUT, AND THE "TT:T" FIELDS CONTAIN THOUSANDTHS
  1861. OF SECONDS.  ╘HE "W" FIELD CONTAINS THE DAY OF THE WEEK, CODED AS 0-6 FOR
  1862. ╙UNDAY TO ╙ATURDAY, AND 7 FOR "UNKNOWN".  ╘HE "╟╟:GG" FIELDS CONTAIN THE
  1863. NUMBER OF HOURS AND MINUTES THAT YOUR TIME ZONE IS OFF FROM ╟═╘.  ╔F THE
  1864. NUMBER IS NEGATIVE (IN THE WESTERN HEMISPHERE), THEN THE REGULAR POSITIVE
  1865. NUMBER OF HOURS WILL BE USED, EXECEPT THAT THE 0X80 BIT OF THE HOURS BYTE WILL
  1866. BE SET.  ╞INALLY, THE "AA" SUB-FIELD IS USED TO ENCODE THE ACCURACY OF THE
  1867. TIMESTAMP.  ╘HE WAY THAT IT IS INTERPRETED IS THAT THE TIME VALUE IS ACCURATE
  1868. TO PLUS/MINUS 2^AA MILLISECONDS.  ╞OR EXAMPLE, IF MY CLOCK WERE ACCURATE TO
  1869. WITHIN ONE SECOND, THEN THIS FIELD WOULD BE SET TO 10 IN ┬├─ (2^10 ==
  1870. 1024MS).  ┴ VALUE OF 99 MEANS "UNKNOWN" (OR THAT THE CLOCK COULD BE OFF BY
  1871. MANY BILLIONS OF BILLIONS OF YEARS).
  1872.  
  1873. ╔ DECIDED TO GO ALL OUT IN DEFINING THE DATE FIELD SO THAT IT WILL BE USEFUL
  1874. IN THE FUTURE WHEN "WORLD CONSCIOUSNESS" WILL BE MUCH MORE IMPORTANT THAN
  1875. IT IS TODAY.
  1876.  
  1877. ┴ND LAST BUT CERTAINLY NOT LEAST, THE FILENAME IS ENCODED IN ┴╙├╔╔ WITH A
  1878. TRAILING ZERO BYTE.
  1879.  
  1880. ╒PON RECEIVING THIS REQUEST, THE SERVER WILL ATTEMPT TO CREATE A FILE
  1881. ACCORDING TO YOUR SPECIFICATIONS, AND WILL SEND BACK A REPLY OF THE FORM:
  1882.  
  1883. ╧╞╞   ╙╔┌   ─┼╙├
  1884. ---   ---   -----
  1885.   0     1   CODE: ┴├╦_╒╨╠╧┴─_╧╨┼╬ ('U')
  1886.   1     1   ERROR CODE: 'Y'=SUCCESSFUL, 'N'=OPEN UNSUCCESSFUL
  1887.   2     -   ╙╔┌┼
  1888.  
  1889. ╘HE "ERROR CODE" FIELD TELLS WHETHER THE OPEN OPERATION WAS SUCCESSFUL OR
  1890. NOT.  ╔F IT WAS, THEN THE CLIENT CAN CONTINUE WITH UPLOADING ITS FILE; IF NOT,
  1891. THEN THAT FILE CANNOT BE UPLOADED (AND THAT THE UPLOAD CHANNEL DOESN'T NEED TO
  1892. BE CLOSED).  ╔T'S UP TO THE CLIENT WHETHER TO GO ON TO THE NEXT FILE, ABORT,
  1893. OR ASK THE USER FOR HELP.  ╘HE CLIENT WILL CURRENTLY REPORT AN ERROR TO THE
  1894. USER AND THEN GO ONTO THE NEXT FILE.  ╧F COURSE, IT'S LIKELY THAT WHATEVER
  1895. CAUSED THE ERROR IN CREATING THE CURRENT FILE WILL ALSO CAUSE AN ERROR IN
  1896. CREATING SUBSEQUENT FILES (INSUFFICIENT ACCESS PERMISSIONS ON THE CURRENT
  1897. DIRECTORY, DISK FULL, ETC.).  ╘HE SERVER WILL OVERWRITE ANY EXISTING FILE
  1898. WITH THE SAME NAME (SINCE ASKING PERMISSION, ETC., WOULD REQUIRE EXTRA
  1899. MECHANISM, AND WOULD PROBABLY BE A NUISANCE ANYWAY).
  1900.  
  1901. ╔F THE UPLOAD CHANNEL IS OPENED SUCCESSFULLY, THEN THE PACKETS OF UPLOAD
  1902. DATA SHOULD BE SENT TO THE SERVER ONE AT A TIME, UNTIL ALL OF THE DATA IS
  1903. UPLOADED.  ╘HE CLIENT SENDS THE FOLLOWING MESSAGE TO THE SERVER TO UPLOAD
  1904. A PACKET OF DATA:
  1905.  
  1906. ╧╞╞   ╙╔┌   ─┼╙├
  1907. ---   ---   -----
  1908.   0     1   CODE; ╥┼╤_╒╨╠╧┴─_╨┴├╦┼╘ ('╥')
  1909.   1     1   UPLOAD SEQUENCE NUMBER
  1910.   2     4   DATA LENGTH: ╚/═/═/╠ WORD
  1911.   6     N   DATA
  1912. 6+N     -   ╙╔┌┼
  1913.  
  1914. ╘HE "UPLOAD SEQUENCE NUMBER", WHICH WAS DESCRIBED BEFORE, IS USED TO MAKE SURE
  1915. THAT RETRANSMISSIONS OF PACKETS ARE DETECTED AND HANDLED PROPERLY, SO THAT
  1916. EACH PACKET OF DATA ONLY APPEARS IN THE FILE ONCE.  ╘HE "DATA LENGTH" FIELD
  1917. TELLS THE NUMBER OF USER DATA BYTES THAT FOLLOW IN THE PACKET, AND THEN THE
  1918. ACTUAL USER DATA BYTES APPEAR.  ╘HE "DATA LENGTH" FIELD IS ACTUALLY REDUNDANT,
  1919. BUT ╔ FIGURED THAT IT WOULD MAKE PROGRAMMING A LITTLE EASIER, AND ALLOWS
  1920. ADDITIONAL ERROR CHECKING.  ╬ORMALLY, EACH UPLOAD-DATA PACKET WILL CONTAIN
  1921. THE MAXIMUM-PACKET-SIZE NUMBER OF BYTES OF USER DATA (ACCORDING TO WHETHER
  1922. TEXT OR BINARY DATA IS BEING UPLOADED), EXCEPT FOR THE LAST PACKET, WHICH
  1923. WILL CONTAIN THE NUMBER OF DATA BYTES THAT ARE LEFT IN THE FILE.  ╚OWEVER,
  1924. EACH PACKET IS ALLOWED TO CONTAIN ANYWHERE FROM 1 TO THE MAXIMUM-PACKET-
  1925. SIZE NUMBER OF BYTES: WHATEVER THE CLIENT WISHES TO USE.  ╓ARIABLE-SIZED
  1926. PACKETS ARE A ╟OOD ╘HING (╘═, ╨AT. ╨END.).  ┘OU WILL NOTE THAT THE DATA-
  1927. SIZE VALUES ARE ALSO WHAT WILL BE USED FOR THE "READ" AND "WRITE" SYSTEM
  1928. CALLS ON THE CLIENT AND SERVER, RESPECTIVELY.  ╔/╧ WILL BE DONE IN BIG,
  1929. EFFICIENT CHUNKS.
  1930.  
  1931. ╒PON RECEIVING EACH UPLOAD PACKET, THE SERVER REPLIES WITH THE FOLLOWING
  1932. ACKNOWLEDGEMENT MESSAGE:
  1933.  
  1934. ╧╞╞   ╙╔┌   ─┼╙├
  1935. ---   ---   -----
  1936.   0     1   CODE: ┴├╦_╒╨╠╧┴─_╨┴├╦┼╘ ('R')
  1937.   1     1   UPLOAD SEQUENCE NUMBER
  1938.   2     -   ╙╔┌┼
  1939.  
  1940. ╔ DON'T THINK THAT THE "SEQUENCE NUMBER" FIELD IS ACTUALLY NECESSARY HERE, BUT
  1941. IT IS INCLUDED TO ALLOW FOR FUTURE EXPANSION AND TO PROVIDE REDUNDANCY FOR
  1942. PROTOCOL-ERROR CHECKING.
  1943.  
  1944. ╫HEN THE CLIENT HAS UPLOADED ALL OF THE PACKETS OF THE FILE CURRENTLY BEING
  1945. UPLOADED, IT THEN SENDS THE FOLLOWING MESSAGE:
  1946.  
  1947. ╧╞╞   ╙╔┌   ─┼╙├
  1948. ---   ---   -----
  1949.   0     1   CODE: ╥┼╤_╒╨╠╧┴─_├╠╧╙┼ ('╓')
  1950.   1     -   ╙╔┌┼
  1951.  
  1952. ╘HIS WILL CLOSE THE UPLOAD CHANNEL AND WILL FINISH WRITING THE UPLOADED FILE
  1953. TO THE ╒NIX FILE SYSTEM.  ╘HE SERVER WILL THEN RESPOND WITH THE FOLLOWING
  1954. MESSAGE TO ACKNOWLEDGE THE REQUEST:
  1955.  
  1956. ╧╞╞   ╙╔┌   ─┼╙├
  1957. ---   ---   -----
  1958.   0     1   CODE: ┴├╦_╒╨╠╧┴─_├╠╧╙┼ ('V')
  1959.   1     4   NUMBER OF BYTES UPLOADED: ╚/═/═/╠ WORD
  1960.   5     -   ╙╔┌┼
  1961.  
  1962. ╘HE "NUMBER OF BYTES" FIELD IS ACTUALLY REDUNDANT, BUT IS USED FOR ADDITIONAL
  1963. ERROR CHECKING.
  1964.  
  1965. 4.3. ╞╔╠┼ ─╧╫╬╠╧┴─╔╬╟
  1966.  
  1967. ─OWNLOADING FILES IS ANALOGOUS TO UPLOADING THEM: FIRST WE OPEN THE DOWNLOAD
  1968. CHANNEL/FILE, THEN WE DOWNLOAD THE PACKETS, AND THEN WE CLOSE THE DOWNLOAD
  1969. CHANNEL.
  1970.  
  1971. ╘O OPEN THE DOWNLOAD CHANNEL, THE CLIENT SENDS THE FOLLOWING REQUEST TO THE
  1972. SERVER:
  1973.  
  1974. ╧╞╞   ╙╔┌   ─┼╙├
  1975. ---   ---   -----
  1976.   0     1   CODE: ╥┼╤_─╧╫╬╠╧┴─_╧╨┼╬ ('─')
  1977.   1     -   ╙╔┌┼
  1978.  
  1979. ╘O WHICH THE SERVER REPLIES WITH:
  1980.  
  1981. ╧╞╞   ╙╔┌   ─┼╙├
  1982. ---   ---   -----
  1983.   0     1   CODE: ┴├╦_─╧╫╬╠╧┴─_╧╨┼╬ ('D')
  1984.   1     1   DATA TYPE: '0'=NO MORE FILES (EOM),'T'=TEXT,'B'=BIN,'E'=ERR,'D'=DIR
  1985.   2     4   ESTIMATED FILE SIZE: ╚/═/═/╠ WORD
  1986.   6     2   PERMISSIONS ("-----SGR:WXRWXRWX"), LIKE ╒NIX, ╚:╠
  1987.   8    12   MODIFIED DATE: ┬├─ FORMAT: <┘┘:┘┘:══:──:HH:MM:SS:TT:TW:╟╟:GG:AA>
  1988.  20     N   FILENAME, NULL-TERMINATED
  1989. 20+N    -   ╙╔┌┼
  1990.  
  1991.